両方のメカニズム、interfaceとtype aliasは、データ構造(オブジェクト、関数、複雑な型)を記述するために使用されます。
違い:
|)とインターセクション(&)に対して使用できます。例:
interface Animal { name: string } interface Dog extends Animal { bark(): void } // 型エイリアスによる型の結合: type MyType = string | number type Cat = Animal & { purr(): void }
推奨:
interfaceを使用することをお勧めします。typeを使用することをお勧めします。質問: type aliasを使用して定義された型に、別のファイルから新しいフィールドを追加できますか?
回答:
できません。Type aliasは別のファイルから宣言的に拡張することはできず、インターフェースとは異なります。
例:
// main.ts type User = { name: string } // another.ts type User = { age: number } // エラー: Duplicate identifier // interface: // main.ts interface User { name: string } // another.ts interface User { age: number } // OK, User = { name: string, age: number }
物語
大規模なプロジェクトでは、共通のデータ構造を型エイリアスを介して定義しました。別のパッケージから既存の型にフィールドを追加する必要が生じたとき、type aliasは宣言的結合をサポートしていないことが分かり、インターフェースに書き換える必要がありました。そのため遅延が発生しました。
物語
開発者の一人がインターフェースを介して関数を定義し、その後ユニオン型(文字列または関数)を追加しようとしましたが、インターフェースはそれに適さないことが分かり、すべての定義をインターセクション/ユニオンを使った型エイリアスに変更しなければなりませんでした。
物語
インターフェースから型エイリアスに変更した後に拡張の構文を混同し、
&を使用する代わりにextendsを使おうとしました。エラーは遅れて現れ、その理由をすぐには理解できませんでした。