公開日: 2023/05/07 @Miz_dev
type Foo = {
a: number;
};
const foo: Foo = {
a: 1,
};
interface Foo {
a: number;
}
const foo: Foo = {
a: 1,
};
Interface は宣言できるものが辞書型としてのオブジェクト。
あくまで辞書型としてのオブジェクトに対して型宣言するもの。
Type Alias は上記に限らず、オブジェクト以外のものに対しても型宣言できる。
Type Alias は open-ended に準拠していないので、同じ名前の宣言があるとエラーが出る。
※open-ended とは同じ名前で宣言があった時に自動的にマージされる性質のこと。
Interface は以下のように extens を用いる
interface Foo {
a: number;
}
interface Bar extends Foo {
b: number;
}
const foo: Bar = {
a: 1,
b: 2,
};
Type Alias は以下のように Intersection Types を用いる。
type Foo = {
a: number;
};
type Bar = Foo & {
b: number;
};
const foo: Bar = {
a: 1,
b: 2,
};
例としてプロパティを number から string へオーバーライドした際には、宣言の時点で、型の互換性が無いというエラーが出るため、予期せぬ値を事前に防ぐことが出来る。
例としてプロパティを number から string へオーバーライドした際には、string かつ number は成り立たないので never となる。
使用できない。
使用できる。
他の型をもとに新しい方を作成するための方法
type Animals = "dog" | "cat";
type foo = {
dog: number;
cat: number;
};
のように Animals が増えれば増えるほど手動で増やしていくことは大変なので、以下のように Mapped Types を用いると自動的に作成することが出来る。
type Animals = "dog" | "cat";
type foo = {
[key in Animals]: number;
};
// 以下の結果となる
// type foo = {
// dog: number;
// cat: number;
// }
結論としては、どちらでも良いが Type Alias に統一した方がおすすめ。
TypeScript の公式にも「ほとんどの場合、個人の好みに応じて選ぶことができます」と記述されている。
また、公式としては Interface を使用して Type Alias でないと出来ないことがあれば Type Alias を使用するよう記述もされているが、Interface と Type Alias のメリット・デメリットで考えると Type Alias の方がメリットが多い部分がある。
Type Alias に統一した方が一貫性があり、簡潔で記述も短くスッキリしている。