型引数(TypeScript)
型引数 #とは
型を定義する際にパラメータを持たせることができる
型引数を宣言すると、その型引数はその宣言の中でだけ有効な型名として扱われる
code:ts
type User<T> = {
name: string;
child: T;
};
型引数 T は宣言の中で型として扱うことができる
上の宣言を読み下すと
「User<T> 型は name プロパティが string 型であり、child プロパティが T 型であるオブジェクトの型」
型引数を持つ型のことをジェネリック型という
型引数を持つ型を使用する
code:ts
type Family<Parent, Child> = {
mother: Parent;
father: Parent;
child: Child;
};
// <> が必要、省略するとコンパイルエラー
const family: Family<number, string> = {
mother: 0,
father: 100,
child: "1000",
};
型引数を持つ型は「型を作るためのもの」?
似たような構造を持つ型をいろいろと扱いたい場合に便利
Family<Parent, Child> 型は、「同じ型の mother, father プロパティを持ち、さらに child プロパティを持つ」という構造を持つ
Family<number, number>, Family<boolean, boolean> など、この構造を保ちつつ、様々な型を作ることができる
<> を省略できないのも、型引数を持つ型が「型を作るためのもの」だから
厳密には Family は型ではなく、Family<number, string> で初めて型だから
部分型関係による型引数の制約
type 文で型引数を宣言するとき、extends という構文を使用できる
「この型引数は常に型の部分型でなければいけない」という制約
code:ts
type HasName = {
name: string;
};
type Family<Parent extends HasName, Child extends HasName> = {
mother: Parent,
father: Parent,
child: Child,
};