TypeScriptでこれを行う方法はありません。これは基本的に実行時の制約です。
C#では、new
派生型の式を実行するときにのみ表示される関数の新しい名前を実際に作成しているが、基本型の式を使用してその名前を使用すると、基本メンバー(基本を含む)が引き続き表示されることを意味します。ケースの実装自体、批判的に)。
TypeScript / JavaScriptでは、オブジェクトには「スロット」が1つだけあり、派生クラスは実際には基本クラスのメンバーを上書きしています。基本クラスが持っていると思ったメンバーを参照する方法がないため、そのメンバーを上書きして基本クラスを壊す可能性が非常に高くなります。
編集して追加:実際に健全である限り、この方法で特殊化を追加できnew
ます(C#の場合と同じで、通常、基本クラスの形状を壊している場合にのみキーワードを使用します)。実行時に型が一貫している場合(つまり、Baseの代わりにDerivedを実際に使用できる場合)、この制限は実際には問題になりません。
declare class Item {}
declare class SpecialItem extends Item { }
declare class MyBase { data: Item[]; }
declare class MyData { }
declare class MyDerived extends MyBase { data: SpecialItem[]; /* OK */ }
declare class MyDerived2 extends MyBase { data: number[]; /* not OK */ }
あなたの例では、 data
inは(そうでなければ契約を破っている)MyDerived
である必要があります:MyData[]
MyBase
declare class MyBase { data: any[]; }
declare class MyData { }
declare class MyDerived extends MyBase { data: MyData[]; /* OK */ }