有没有办法在TypeScript中重新定义属性?

时间:2013-03-07 17:42:34

标签: typescript

我有一个基类,它将data属性定义为any[]。在派生类中,我想使用不同的类型重新声明此属性。所以我在寻找TypeScript中的某种“C# new modifier”功能。有没有办法在TypeSctipt中做这样的事情?

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

1 个答案:

答案 0 :(得分:3)

在TypeScript中无法做到这一点。它基本上是一个运行时约束。

在C#中,new表示您实际为该函数创建了一个新名称,该函数仅在通过派生类型的表达式时可见,但是通过基类型的表达式使用该名称仍然可以看到基本成员(包括在基本案例实现本身,批判性地)。

在TypeScript / JavaScript中,对象中只有一个“槽”,派生类实际上覆盖了基类的成员。通过覆盖该成员来破坏基类的可能性非常高,因为基类无法引用它认为具有的成员。

编辑以添加:只要实际声音正确,您可以以这种方式添加特化(与C#相同,您通常只使用{{1如果你破坏基类形状,则为关键字)。如果您的类型在运行时是连贯的(即您实际上可以使用Derived代替Base),则此限制实际上不应该是一个问题:

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