🚧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を作り出す必要があります。
typescripttype Array<T> = ES2016Array<T> & ES2019Array<T>;
typescripttype Array<T> = ES2016Array<T> & ES2019Array<T>;
このDeclaration mergingの機能はポリフィルを行うパッケージの型定義でよく見ることができます。