在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 */ }
在你的榜樣,data
在MyDerived
將需要一個MyData[]
(否則你打破了MyBase
合同):
declare class MyBase { data: any[]; }
declare class MyData { }
declare class MyDerived extends MyBase { data: MyData[]; /* OK */ }
我只是工作的一個定義文件的第三方的lib從而改變在派生類類型的屬性(JavaScript的本身並沒有這樣的限制而使由開發商自行決定的後果)。所以你說在TypeScript中沒有辦法反映這種轉變,是不是? – 2013-03-07 18:29:59
編輯添加您可以/不能這樣做的例子 – 2013-03-07 18:51:12