마지막으로 타입에서 null과 undefined를 제거하는 NonNullable 타입을 만들어보겠습니다.
type MyNonNullable<T> = T extends null | undefined ? never : T;
type Result = MyNonNullable<string | number | null | undefined>;
// type Result = string | number
T가 string | number | null | undefined 타입이라고 해봅시다. 제네릭과 유니언이 만났으므로 분배법칙이 실행되어 NonNullable<string> | NonNullable<number> | NonNullable<null> | NonNullable<undefined>가 됩니다. 여기서 다시 string | number | never | never가 되고, 최종적으로는 string | number가 됩니다.
하지만 이것은 예전 코드이고 요즘은 NonNullable 타입이 다음과 같이 더 간단하게 변경되었습니다.
type MyNonNullable<T> = T & {};
T가 string | number | null | undefined라고 해봅시다. {}는 string과 number는 포함하나 null과 undefined는 포함하지 않습니다. 따라서 T와 {}의 교집합은 string | number입니다. 이러한 이유로 NonNullable 타입이 T & {}로 간소화되었습니다.