0Pricing
TypeScript Academy · レッスン

条件型:T extends U ? X : Y

条件型で型レベルのif文を記述します。

「条件型:T extends U ? X : Y」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

ようこそ

条件型を使うと、型レベルのif文を表現できます。条件型は、ユーティリティ型の構築に使われるTypeScriptの高度な型システムの中核です。

基本構文

T extends U ? X : Yと記述します。TがUに代入可能であれば結果はX、そうでなければYになります。
type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false

組み込みのNonNullable

NonNullableは、Tからnullとundefinedを取り除く条件型として実装されています。
type NonNullable<T> = T extends null | undefined ? never : T;
type C = NonNullable<string | null>; // string

ジェネリクスを使った条件型

条件型は、ジェネリック関数や型エイリアスの内部で最も役立ちます。
type Flatten<T> = T extends Array<infer I> ? I : T;
type Str = Flatten<string[]>; // string
type Num = Flatten<number>;   // number

入れ子になった条件型

条件型は、より複雑なロジックのために入れ子にできます。
type TypeName<T> =
  T extends string ? 'string' :
  T extends number ? 'number' :
  T extends boolean ? 'boolean' :
  'object';

ユニオンに対する分配

Tが単独の型パラメーターである場合、条件型はユニオンの各メンバーに分配されます。
type ToArray<T> = T extends any ? T[] : never;
type R = ToArray<string | number>; // string[] | number[]

分配の防止

Tをタプルでラップすると、分配を防止できます。
type NoDistribute<T> = [T] extends [any] ? T[] : never;
type R2 = NoDistribute<string | number>; // (string | number)[]

neverを使ったフィルタリング

条件型からneverを返すと、ユニオンのメンバーが取り除かれます。
type OnlyStrings<T> = T extends string ? T : never;
type S = OnlyStrings<'a' | 'b' | 1 | 2>; // 'a' | 'b'

マップ型での条件型

マップ型と条件型を組み合わせると、オブジェクトのプロパティを選択的に変換できます。
type NullableValues<T> = { [K in keyof T]: T[K] extends string ? null : T[K] };

関数パラメーターからの推論

条件型内でinferを使用すると、複雑な型の一部を抽出できます。
type FirstParam<T> = T extends (first: infer P, ...rest: any[]) => any ? P : never;
type FP = FirstParam<(a: string, b: number) => void>; // string

組み込みの条件型ユーティリティ

多くの組み込みユーティリティ(ReturnType、Parameters、InstanceType)は、条件型とinferを使って構築されています。
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

確認問題

`type R = string extends object ? 'yes' : 'no'`の結果は何ですか?

まとめ

条件型(T extends U ? X : Y)によって、型レベルのロジックを実現できます。条件型はユニオンに分配され、inferと組み合わせて抽出に利用でき、TypeScriptの多くの組み込みユーティリティ型を支えています。

よくある質問

「条件型:T extends U ? X : Y」レッスンは無料ですか?

はい。「条件型:T extends U ? X : Y」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「条件型:T extends U ? X : Y」で何を学びますか?

条件型で型レベルのif文を記述します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「条件型:T extends U ? X : Y」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. keyofとインデックスアクセス型
  2. ジェネリック制約:型パラメーターの絞り込み
  3. 条件型:T extends U ? X : Y
  4. 分配条件型
← TypeScript Academyに戻る