0

dataプロパティを として定義する基本クラスがありますany[]。派生クラスで、このプロパティを別の型で再宣言したいと考えています。そこで、TypeScriptの「 C# new modifier 」機能を探しています。TypeSctipt でこのようなことを行う方法はありますか?

declare class MyBase { data: any[]; }
declare class MyData { }
declare class MyDerived extends MyBase { data: MyData; /* <--- problem */ }
4

1 に答える 1

3

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 */ }

あなたの例では、 datainは(そうでなければ契約を破っている)MyDerivedである必要があります:MyData[]MyBase

declare class MyBase { data: any[]; }
declare class MyData { }
declare class MyDerived extends MyBase { data: MyData[]; /* OK */ }
于 2013-03-07T18:25:08.353 に答える