이번에는 어떠한 타입에서 지정한 타입만 추출해내는 Extract 타입을 만들어보겠습니다.
type MyExtract<T, U> = T extends U ? T : never;
type Result = MyExtract<1 | '2' | 3, string>;
// type Result = "2"
Extract 타입은 Exclude 타입과 하는 행동이 반대입니다. 컨디셔널 타입의 참, 거짓 부분만 서로 바꾸면 됩니다.
다음은 특정 객체에서 지정한 속성을 제거하는 Omit 타입입니다.
type MyOmit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
type Result = MyOmit<{ a: '1', b: 2, c: true }, 'a' | 'c'>;
// type Result = { b: 2 }
Omit 타입은 Pick 타입과 반대되는 행동을 합니다. 그러면서 Omit 타입은 Pick과 Exclude 타입을 활용합니다.
먼저 Exclude<keyof T, K>를 하여 지정한 속성을 제거합니다. 'a' | 'b' | 'c' 중에 'a' | 'c'를 지정했으니 'b'만 추려집니다. Pick 타입을 통해 객체에서 추려낸 속성을 선택합니다. 최종적으로 'b' 속성만 있는 객체 타입이 남게 됩니다.