🚧interfaceとtypeの違い
型エイリアスを利用することで、インターフェースと同様の定義が行なえます。
typescript
type Animal = {name: string;bark(): string;};interface Animal {name: string;bark(): string;}
typescript
type Animal = {name: string;bark(): string;};interface Animal {name: string;bark(): string;}
この章では、インターフェースと型エイリアスの違いについて詳しく説明していきます。
#
インターフェースと型エイリアスの違い内容 | インターフェース | 型エイリアス |
---|---|---|
継承 | 可能 | 不可。ただし交差型で表現は可能 |
継承による上書き | 上書きまたはエラー | フィールド毎に交差型が計算される |
同名のものを宣言 | 定義がマージされる | エラー |
Mapped Type | 使用不可 | 使用可能 |
#
継承インターフェースは、インターフェースや型エイリアスを継承できます。
typescript
interface Animal {name: string;}type Creature = {dna: string;};interface Dog extends Animal, Creature {dogType: string;}
typescript
interface Animal {name: string;}type Creature = {dna: string;};interface Dog extends Animal, Creature {dogType: string;}
一方、型エイリアスは継承は行なえません。代わりに交差型(&)を使用することで、継承と似たことを実現できます。
typescript
type Animal = {name: string,};type Creature = {dna: string,};// NGtype Dog extends Animal// OKtype Dog = Animal &Creature & {dogType: string,};
typescript
type Animal = {name: string,};type Creature = {dna: string,};// NGtype Dog extends Animal// OKtype Dog = Animal &Creature & {dogType: string,};
#
プロパティのオーバーライドインターフェースで継承の際にプロパティをオーバーライドした際には、継承元のプロパティの型が
typescript
// OKinterface Animal {name: any;price: {yen: number;};legCount: number;}interface Dog extends Animal {name: string;price: {yen: number;doller: number;};}// 最終的なDogの定義interface Dog {name: string;price: {yen: number;doller: number;};legCount: number;}// NGinterface A {numberField: number;price: {yen: number;doller: number;};}interface B extends A {numberField: string; // Error:stringはnumberに代入できないため// Error:dollerフィールドが無く、Aのpriceに代入できないためprice: {yen: number;euro: number;};}
typescript
// OKinterface Animal {name: any;price: {yen: number;};legCount: number;}interface Dog extends Animal {name: string;price: {yen: number;doller: number;};}// 最終的なDogの定義interface Dog {name: string;price: {yen: number;doller: number;};legCount: number;}// NGinterface A {numberField: number;price: {yen: number;doller: number;};}interface B extends A {numberField: string; // Error:stringはnumberに代入できないため// Error:dollerフィールドが無く、Aのpriceに代入できないためprice: {yen: number;euro: number;};}
一方、型エイリアスの場合は上書きにはならず、フィールドの型の交差型が計算されます。また、交差型で矛盾があって計算できない場合もコンパイルエラーにはなりません。
typescript
type Animal = {name: number;price: {yen: number;doller: number;};};type Dog = Animal & {name: string;price: {yen: number;euro: number;};};// 最終的なDogの定義type Dog = {name: never; // 交差型作れない場合はコンパイルエラーではなくnever型になるprice: {yen: number;doller: number;euro: number;};};
typescript
type Animal = {name: number;price: {yen: number;doller: number;};};type Dog = Animal & {name: string;price: {yen: number;euro: number;};};// 最終的なDogの定義type Dog = {name: never; // 交差型作れない場合はコンパイルエラーではなくnever型になるprice: {yen: number;doller: number;euro: number;};};
#
同名のものを宣言TODO: 書く
#
Mapped TypeTODO: 書く
#
インターフェースと型エイリアスの使い分けインターフェースは型の宣言であり、型エイリアスは型に名前をつける機能です。この定義に立ち返って使い分けをしましょう。
TODO: 残りを書く