본문 바로가기
Language/Typescript

타입챌린지 : 3-Omit (medium)

by hsloth 2023. 3. 11.

 

이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.

 

https://github.com/type-challenges/type-challenges/blob/main/questions/00003-medium-omit/README.md

 

GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

Collection of TypeScript type challenges with online judge - GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge

github.com

 

type MyOmit<T, K extends keyof T> = {
	[P in keyof T as P extends K ? never : P]: T[P]
}

// 2
type MyExclude<T, K> = T extends K ? never : T;

type MyOmit<T, K extends keyof T> = {
	[P in MyExclude<keyof T, K>]: T[P]
}

// test case
type cases = [
  Expect<Equal<Expected1, MyOmit<Todo, 'description'>>>,
  Expect<Equal<Expected2, MyOmit<Todo, 'description' | 'completed'>>>,
]

// @ts-expect-error
type error = MyOmit<Todo, 'description' | 'invalid'>

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

interface Expected1 {
  title: string
  completed: boolean
}

interface Expected2 {
  title: string
}

 

1번 설명

type MyOmit : MyOmit이라는 타입 정의

<T, K extends keyof T> : T와 K를 받는데, K는 T의 key이다. (T의 key인게 K의 조건이다)

[P in keyof T as P extends K ? never : P]: T[P] : 중간에 as가 들어가서 조금 어려웠다. 일단, P in keyof T는 T의 키값들을 P라는 타입인자로 하나씩 빼내겠다는 뜻이고(T의 키값을 배열처럼 원소 하나하나 돌면서 P로 정의한다는 뜻)

as P extends K ? never : P 는 if문이라고 생각하면 된다.

즉, T의 키값을 P로 정의할건데, 만약 P가 K를 상속하면 never를 리턴하고 아니면 P값을 리턴한다. 는 뜻이다.

 

좀더 쉽게 해석하면, 다음 블로그를 참고하자.

이 블로그에서는 as는 '그런데' 라고 생각하기로 했다고 한다.

개인적으로 이 해석이 더 쉽다고 생각한다.

https://bkdragon0228.tistory.com/m/3

 

key in keyof T as key extends K ? never : key ???

what the ? 제목의 문장은 아래의 문제를 풀면서 만나게 되었다. https://github.com/type-challenges/type-challenges/blob/main/questions/00008-medium-readonly-2/README.ko.md GitHub - type-challenges/type-challenges: Collection of TypeScript

bkdragon0228.tistory.com

 

2번 설명

Omit<T, K> 라는건, T에서 K값을 빼고 리턴하는 것이다.

따라서 Exclude타입을 이용하면 되겠다고 생각했다.

https://suloth.tistory.com/30

 

타입챌린지 : 43-Exclude (easy)

이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다. https://github.com/type-challenges/type-challenges/blob/main/questions/00043-easy-exclude/READM

suloth.tistory.com

 

Exclude<T, K> 는 T가 K이면 제외하는 타입이기 때문에 이를 이용했다.

 

type MyOmit : MyOmit이라는 타입을 정의한다.

<T, K extends keyof T> : T와 K를 정의하는데 K는 T의 key값을 받는다.

[P in MyExclude<keyof T, K>]: T[P] : T의 키값이 K와 같은건 제외한 것들을 P로 정의하면 끝.