我有一个基类,它将data
属性定义为any[]
。在派生类中,我想使用不同的类型重新声明此属性。所以我在寻找TypeScript中的某种“C# new modifier”功能。有没有办法在TypeSctipt中做这样的事情?
declare class MyBase { data: any[]; }
declare class MyData { }
declare class MyDerived extends MyBase { data: MyData; /* <--- problem */ }
答案 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