이 글은 제가 타입챌린지를 하면서 해석한 내용을 적는 글입니다. 틀린 내용이 있으면 댓글 달아주시면 감사하겠습니다.
https://github.com/type-challenges/type-challenges/blob/main/questions/00003-medium-omit/README.md
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
2번 설명
Omit<T, K> 라는건, T에서 K값을 빼고 리턴하는 것이다.
따라서 Exclude타입을 이용하면 되겠다고 생각했다.
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로 정의하면 끝.
'Language > Typescript' 카테고리의 다른 글
타입챌린지 : 9-Deep Readonly (medium) (0) | 2023.03.16 |
---|---|
타입챌린지 : 8-Readonly 2 (medium) (0) | 2023.03.12 |
타입챌린지 : 2-Get Return Type (medium) (0) | 2023.03.08 |
타입챌린지 : 3312-Parameters (easy) (0) | 2023.03.06 |
타입챌린지 : 3060-Unshift (easy) (0) | 2023.03.06 |