Types 型変数 K に与えられたユニオン型をfor 文のように型変数 X に割り当て、 X をキーとするオブジェクト型を 返す。またそのキー X に対応する : の右辺で X が使える。 そして K をオブジェクト型のキーとすることを考える ` ` type MyPick<T extends object, K extends keyof T> = { [X in K]: X /* まだT を使っていない */ } ` ` ` ` ` ` ` ` ` ` ` ` ` ` type AB = { [X in "a" | "b"]: X } // これは以下と同義 type AB = { a: "a", b: "b" }
U> の T にユニオン型 1 | 2 を渡した時、以下のように分配される これは数学における掛け算の分配法則と同じ より正確には T extends U ? X : Y の T にユニオン型が渡されたときに起こる。 完成形 type MyExclude<T, U> = T extends U ? never : T ` ` ` ` ` ` (1 | 2) extends U ? never : T => (1 extends U ? never : 1) | (2 extends U ? never : 2) (1 + 2) × u = (1 × u) + (2 × u) ` ` ` `
extends Y ? L : R )の Y 以降に使えるキーワード X extends Y<infer Z> において X extends Y<any> を満たすとき、 any の部分にマッチする型を型 変数 Z に代入し、 L の部分で使えるようにする。 これだけだと以下のようにネストされたPromise に対応できない。 惜しい実装 type MyAwaited<T extends Promise<any>> = T extends Promise<infer U> ? U : never; ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` MyAwaited<Promise<string>> => Promise<string> extends Promise<infer U /* string に推論 */> ? U : never => string MyAwaited<Promise<Promise<string>>> => Promise<Promise<string>> extends Promise<infer U> ? U : never => Promise<string>
T 、 C が falsy である場合の戻り値の型 F を受け取る If を実装します。 条件値 C は true か false のどちらかであることが期待されますが、 T と F は任 意の型をとることができます。 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` type A = If<true, 'a', 'b'>; // expected to be 'a' type B = If<false, 'a', 'b'>; // expected to be 'b'