メインコンテンツまでスキップ

🚧open-endedと宣言マージ(declaration merging)

インターフェースのみができる機能で、もっともタイプエイリアスと異なる特徴です。

JavaScriptがES2015, ES2016, ES2017, ES2018, ES2019と進化するにつれ、既存のクラスにもメソッドが追加されることもあります。たとえばArrayクラスはES2016でarray.includes()が、ES2019でarray.flatMap()が追加されました。

インターフェースではバージョンごとにメソッドのArrayのインターフェースをファイルを分けて定義して、環境に応じて読み込むファイルを変えるだけでArrayの型定義ができます。

typescript
// ES2016.array.ts
interface Array<T> {
includes(...): boolean;
}
// ES2019.array.ts
interface Array<T> {
flatMap<U>(...): U[];
}
typescript
// ES2016.array.ts
interface Array<T> {
includes(...): boolean;
}
// ES2019.array.ts
interface Array<T> {
flatMap<U>(...): U[];
}

もしこれをタイプエイリアスでやるとすれば、次のようになるでしょう。最終的な成果物がArrayとなる必要があるため、それまで別の名前で定義して、最後にインターセクション型を使い合成してArrayを作り出す必要があります。

typescript
type Array<T> = ES2016Array<T> & ES2019Array<T>;
typescript
type Array<T> = ES2016Array<T> & ES2019Array<T>;

このDeclaration mergingの機能はポリフィルを行うパッケージの型定義でよく見ることができます。