Omit - medium - [Type Challenge]

강성훈·2023년 1월 25일
0

type-challenges

목록 보기
15/20
post-thumbnail

by Anthony Fu @antfu

문제

T에서 K 프로퍼티만 제거해 새로운 오브젝트 타입을 만드는 내장 제네릭 Omit<T, K>를 이를 사용하지 않고 구현하세요.

interface Todo {
  title: string
  description: string
  completed: boolean
}

type TodoPreview = MyOmit<Todo, 'description' | 'title'>

const todo: TodoPreview = {
  completed: false,
}

솔루션

같은 솔루션이지만 다양한 코드를 써놓겠습니다.

첫 번 째 솔루션

만들 제네릭은 2개의 타입변수를 받는다. 객체 타입과 그 객체타입의 키에 해당하는 것들인 유니온,

type MyOmit<T, U extends keyof T> = ??

그리고 T의 키 값들 중에서 U의 값을 Exclude하여 나온 만큼 반환

type MyOmit<T, U extends keyof T> = {[t in Exclude<keyof T, U>]: T[t]}

두 번 째 솔루션

첫 번 째와 마찬가지로 타입변수를 받는다.

type MyOmit<T, U extends keyof T> = ??

as를 이용하여 타입을 매핑시킬것이다.

type MyOmit2<T, U extends keyof T> = { [t in keyof T as Exclude<t, U>]: T[t] };

세 번 째 솔루션

조건부를 이용하여 U에 해당한다면 never를 아니라면 t를 반환

type MyOmit3<T, U extends keyof T> = {
  [t in keyof T as t extends U ? never : t]: T[t];
};
profile
고등학생 주니어 개발자

0개의 댓글