여기까지 배웠으면 이전 절에서 언급했던, 일부 속성만 옵셔널로 만드는 타입을 작성할 수 있습니다. Optional 타입은 lib.es5.d.ts에 있는 타입이 아닙니다.
type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
type Result = Optional<{ a: 'hi', b: 123 }, 'a'>;
// type Result = { a?: 'hi', b: 123 }
일부 속성만 옵셔널로 만들려면 옵셔널이 될 속성과 아닌 속성을 구분해야 합니다. 옵셔널이 될 속성은 Pick으로 고른 뒤에 Partial을 적용하고({ a?: 'hi }), 아닌 속성들은 Omit<T, K>로 추리면 됩니다({ b : 123 }). 이 둘을 & 연산자로 합치면 Optional 속성이 됩니다. 헷갈리면 T와 K에 실제 타입을 넣어서 하나씩 결과 타입으로 바꾸면서 분석해보세요.
다음 절에서는 infer를 활용한 타입들을 살펴보겠습니다.