2013-03-07 124 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

相关问题