2.15 조건문과 비슷한 컨디셔널 타입이 있다


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>;