챌린지

입력 타입으로 T를 받는 타입 IsNever<T>를 구현해보세요. T의 타입이 never로 결정된다면 true를 반환하고 반대의 경우 false를 반환합니다.

예시:

type A = IsNever<never>; // expected to be true
type B = IsNever<undefined>; // expected to be false
type C = IsNever<null>; // expected to be false
type D = IsNever<[]>; // expected to be false
type E = IsNever<number>; // expected to be false

해답

타입이 never에 할당 가능한지 확인하는 가장 확실한 방법은 조건부 타입을 사용하 는 것입니다. 타입 Tnever에 할당할 수 있다면 true를 반환하고 반대의 경우 false를 반환합니다.

type IsNever<T> = T extends never ? true : false;

아쉽지만 never의 경우 테스트 케이스를 통과할 수 없습니다. 이유가 무엇일까요?

never 타입은 발생 불가능한 타입에 대한 표현입니다. never 타입은 타입스크립트 에서 모든 다른 타입의 서브타입이고 따라서 어떤 타입에도 never를 할당할 수 없습 니다. never의 서브타입은 존재하지 않기 때문에 never는 스스로인 never를 제 외하고는 어떤 타입도 할당될 수 없습니다.

이는 또다른 문제로 이어집니다. never에 아무 타입도 할당할 수 없다면 어떤 타입 이 never에 할당 가능한지 어떻게 확인할 수 있을까요?

never를 활용한 타입을 만들어 보는 것은 어떨까요? 타입 Tnever에 할당 가 능한지 확인하지 않고 never를 포함한 튜플에 대해 확인 해보겠습니다. 이 경우엔형 식상 never에 어떤 타입을 할당하려는 것이 아닙니다.

type IsNever<T> = [T] extends [never] ? true : false;

위와 같은 참신한 방법을 통해 주어진 타입이 never 타입인지 확인하는 제네릭 타입 을 구현하여 테스트를 통과할 수 있습니다.

참고