2013-03-07 121 views
0

我有一個基類,將data屬性定義爲any[]。在派生類中,我想用不同的類型重新聲明該屬性。所以我正在尋找TypeScript中的某種「C# new modifier」功能。有沒有辦法在TypeSctipt中做這樣的事情?有沒有辦法在TypeScript中重新定義一個屬性?

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

回答

3

在TypeScript中沒有辦法做到這一點。這基本上是一個運行時間約束。

在C#中,new意味着您實際上爲該函數創建了一個新名稱,該名稱僅在通過派生類型的表達式時纔可見,但通過基類型的表達式使用該名稱仍然可以看到基礎成員(包括在基本情況下的執行本身,批判地)。

在TypeScript/JavaScript中,對象中只有一個「槽」,派生類實際上是覆蓋基類的成員。賠率非常高,你會通過覆蓋該成員來打破基類,因爲基類沒有辦法引用它認爲的成員。

編輯補充:您可以只要他們實際上是聲音(同在C#中,你通常會只使用new關鍵字如果你打破了基類的形狀)增加特這樣。此限制不應該實際上是,如果你的類型是一致的在運行時(也就是你實際可以使用的替代鹼的派生)一個問題:

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

在你的榜樣,dataMyDerived將需要一個MyData[](否則你打破了MyBase合同):

declare class MyBase { data: any[]; } 
declare class MyData { } 
declare class MyDerived extends MyBase { data: MyData[]; /* OK */ } 
+0

我只是工作的一個定義文件的第三方的lib從而改變在派生類類型的屬性(JavaScript的本身並沒有這樣的限制而使由開發商自行決定的後果)。所以你說在TypeScript中沒有辦法反映這種轉變,是不是? – 2013-03-07 18:29:59

+0

編輯添加您可以/不能這樣做的例子 – 2013-03-07 18:51:12

相關問題