🚧open-endedと宣言マージ(declaration merging)
インターフェースのみができる機能で、もっともタイプエイリアスと異なる特徴です。
JavaScriptがES2015, ES2016, ES2017, ES2018, ES2019と進化するにつれ、既存のクラスにもメソッドが追加されることもあります。たとえばArray
クラスはES2016でarray.includes()
が、ES2019でarray.flatMap()
が追加されました。
インターフェースではバージョンごとにメソッドのArray
のインターフェースをファイルを分けて定義して、環境に応じて読み込むファイルを変えるだけでArray
の型定義ができます。
typescript
// ES2016.array.tsinterface Array<T> {includes(...): boolean;}// ES2019.array.tsinterface Array<T> {flatMap<U>(...): U[];}
typescript
// ES2016.array.tsinterface Array<T> {includes(...): boolean;}// ES2019.array.tsinterface 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の機能はポリフィル
を行うパッケージの型定義でよく見ることができます。