在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