type A1 = string;
type B1 = A1 extends string ? number : boolean;
type A2 = number;
type B2 = A2 extends string ? number : boolean;
→ 여기서 extends는 삼항연산자와 같이 사용됨
특정 타입
extends다른 타입 ? 참일 때 타입 : 거짓일 때 타임
명시적으로 extends 해야만 참이되는 것은 아님
interface X {
x: number;
}
interface XY {
x: number;
y: number;
}
interface YX extends X {
y: number;
}
type A = XY extends X ? string : number; // string
type B = YX extends X ? string : number; // string
→ XY는 X를 명시적으로 extends를 하지 않아도 A는 string 임
→ XY 타입이 X 타입에 대입 가능하기에 extends 하는 것과 다름 없기 때문
컨디셔널 타입은 타입 검사를 위해서도 많이 사용됨
type Result = 'hi' extends string ? true : false;
type Result2 = [1] extends [string] ? true : false;
또한 never과 함께 사용할 때도 많음. 다음은 타입이 string | number 이면 배열로 만들고, 그게 아니면 never 로 만드는 코드
type Start = string | number;
type New = Start extends string | number ? Start[] : neber;
let n: New = ['hi'];
n = [123];
단순한 상황에서는 never과 함께 쓸 이유가 없음. 보통은 제네릭과 더불어 쓸 때만 never가 의미가 있음
type ChooseArray<A> = A extends string ? string[] : never;
type StringArray = ChooseArray<string>;
type Never = ChooseArray<number>;