0つ以上の型引数を入力として、条件分岐を行い導出する型。 ```ts // 『型Xは、AがBに代入可能であるときはC、そうでなければDである』と同意 type X = A extends B ? C : D; ``` ## `number`または`string`を入力すると逆の型をとるケース ```ts type Other<T extends number | string> = T extends number ? string : number; declare const typeA: Other<number>; // ^? declare const typeB: Other<string>; // ^? declare const typeC: Other<boolean>; // Type 'boolean' does not satisfy the constraint 'string | number'.(2344) ``` <button class="playground"><a href="https://www.typescriptlang.org/play?#code/C4TwDgpgBA8sAWEBOAeAKlCAPYEB2AJgM5R4CuAtgEbJQA+URwSAlngOYB8UAvFBtlyES5arQD8jZm3ZQAXKUo0kAbgBQaghADGAGwCGSaNoD2eJlFCQAggriJUo5Z3UB6V1E9fvngHrjNHQMjKFNzYEtwCAAhOwRkFCZWDhc1dx8MqH9AvUNjMwsrCABhOIcUKhMTXQh9PFT0tCioAHJK6tq8FqgCEwgREwiifWAWIgAzEEtEUILmfTYIlqSZekUxJBaAOgAKACYAZgAWI4BKNSA">Playground</a></button> ## typeで別名を定義せずに直接使うケース ```ts interface IdLabel { id: number; } interface NameLabel { name: string; } // Conditional Typesを使わないと以下のようなオーバーロード + 実装がいる // function createLabel(id: number): IdLabel; // function createLabel(name: string): NameLabel; // function createLabel(nameOrId: string | number): IdLabel | NameLabel; function createLabel<T extends string | number>( nameOrId: T ): T extends string ? NameLabel : IdLabel { throw "unimplemented"; } const a = createLabel(1); // ^? const b = createLabel("hoge"); // ^? ``` <button class="playground"><a href="https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgJIBMAycBGEA2yA3gFDLLDoBcyIArgLZ5QDcJAviaJLIigHJwGEbHkKlyIIRBoBnMFFABzNpxIB6dcgDCAexDpgYYPriEAKgE8ADhFmAkhkD+8oHiGQFYMgEQZAFgyBTuUDQcoDsGQAiGQDEGV0AqhkAfhkAFhgjAW4YIwEmGZEBof+RAfO1AUYjAGQZ3QGiGDS0YOhAEY31kBCgIOEhRAgAKShp6JmgAShoMOvw2TWQikrKQCqqakVwGqWE5BWUO5EFhbt7C4tKTYcrq2on8eqmIAHkoDBnFECVkAB9aRmZ5rt3rhellkhIB9fKtse6AHnMyAgAA9IAZZMh5OdLjcWswAHz1Mi0aTHU7IcwkeaAkFg9AQqHKZAAfheSyenSwTwkyDAAAsoLoAO7IABExWADGs+AgwnAEHQrNU7wQ+nkyDgyAAvCNtuMxPUAIxtFbkcgAPWJJFFIHFOGlst+u3qrLpuiUEFZKoKauQmpIQA">Playground</a></button> ## MOC - 📒**関連** - [[inferキーワード (TypeScript)|inferキーワード]] - [[条件付き型は分配的 (TypeScript)|条件付き型は分配的]] - 📜**アクティビティ** - 📝**トラブルシューティング**