TypeScript の条件型 extends

TypeScriptにおけるextendsキーワードは、クラスの継承だけでなく、条件型の定義にも使用できます。

条件型とは、型システム内で条件を判定する仕組みである。 extends キーワードを用いることで、与えられた型条件に応じて最終的な型を決定できる。条件型の構文は次のとおりである。

T extends U ? X : Y

T が判定される型、Uは判定する型で、XとYは判定結果によってそれぞれ返す型

以下に簡単な例を示します。

type TypeName<T> =
T extends string ? "string" :
T extends number ? "number" :
T extends boolean ? "boolean" :
T extends undefined ? "undefined" :
T extends Function ? "function" :
"object";
type T1 = TypeName<string>;  // "string"
type T2 = TypeName<"hello">;  // "string"
type T3 = TypeName<123>;  // "number"
type T4 = TypeName<true>;  // "boolean"
type T5 = TypeName<undefined>;  // "undefined"
type T6 = TypeName<() => void>;  // "function"
type T7 = TypeName<object>;  // "object"
type T8 = TypeName<number[]>;  // "object"

上記の例では、与えられた型Tの型名に応じて、それに対応する文字列型を返す条件型TypeNameを定義します。型の相違に応じて、返される結果は “string”、”number”、”boolean”、”undefined”、”function”、”object” のいずれかとなります。

extendsキーワードを使用することで、型条件に応じた最終的な返り型を確定できます。Tが文字列型であれば最終的な返り型は「文字列」、Tが数値型であれば最終的な返り型は「数値」、それ以外に該当しない型の場合、最終的な返り型は「オブジェクト」になります。

条件型のextendsキーワードの使い方は、JavaScriptの三項演算子と似ています。

bannerAds