YX는 X를 명시적으로 extends하므로 B는 참일 때 타입인 string입니다. 하지만 XY는 X를 명시적으로 extends하지 않음에도, A는 마찬가지로 string입니다. XY 타입이 X 타입에 대입 가능하므로 extends하는 것과 다름 없기 때문입니다.
컨디셔널 타입은 타입 검사를 위해서도 많이 사용합니다.
type Result = 'hi' extends string ? true : false;
// type Result = true
type Result2 = [1] extends [string] ? true : false;
// type Result2 = false
앞의 코드를 통해 'hi'가 string 타입인지 아닌지를 알아낼 수 있습니다. 또한 [1]도 [string] 타입이 아님을 확인했습니다. [1]은 [number]나 number[] 타입입니다.
또한, 컨디셔널 타입은 never와 함께 사용할 때도 많습니다. 다음은 타입이 string | number이면 배열로 만들고, 그게 아니면 never로 만드는 코드입니다.
type Start = string | number;
type New = Start extends string | number ? Start[] : never;
let n: New = ['hi'];
n = [123];