더북(TheBook)

앞에서 never는 모든 타입을 extends할 수 있다고 했습니다. 그런데 RR 타입은 true가 아니라 never입니다. Tnever가 되면서 분배법칙이 일어났기 때문입니다. 단, never는 공집합과 같으므로 공집합에서 분배법칙을 실행하는 것은 아무것도 실행하지 않는 것과 같습니다. 따라서 결과는 never입니다.

간단하게 컨디셔널 타입에서 제네릭과 never가 만나면 never가 된다고 생각하면 됩니다. 따라서 never를 타입 인수로 사용하려면 분배법칙이 일어나는 것을 막아야 합니다.

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

같은 이유로 제네릭과 컨디셔널 타입을 같이 사용할 때는 다음 사항을 조심해야 합니다.

function test<T>(a: T) {
  type R<T> = T extends string ? T : T;
  const b: R<T> = a;
}
// Type 'T' is not assignable to type 'R<T>'
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.