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

有没有办法在TypeScript中重新定义属性?,typescript,Typescript,我有一个基类,它将data属性定义为any[]。在派生类中,我想用不同的类型重新声明此属性。所以我在寻找TypeScript中的某种“”功能。在TypesTipt中有没有这样的方法 declare class MyBase { data: any[]; } declare class MyData { } declare class MyDerived extends MyBase { data: MyData; /* <--- problem */ } 声明类MyBase{data:a

我有一个基类,它将
data
属性定义为
any[]
。在派生类中,我想用不同的类型重新声明此属性。所以我在寻找TypeScript中的某种“”功能。在TypesTipt中有没有这样的方法

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

声明类MyDerived扩展了MyBase{data:MyData;/*在TypeScript中没有这样做的方法。它基本上是一个运行时约束

在C#中,
new
意味着您实际上正在为函数创建一个新名称,该名称仅在遍历派生类型的表达式时可见,但在基类型的表达式中使用该名称仍然可以看到基成员(关键是在基案例实现本身中)

在TypeScript/JavaScript中,对象中只有一个“槽”,而派生类实际上正在覆盖基类的成员。覆盖该成员可能会破坏基类,因为基类无法引用它认为拥有的成员

Edit to add:您可以通过这种方式添加专门化,只要它们确实合理(与C#中相同,在C#中,如果您打破了基类形状,您通常只会使用
new
关键字)。如果您的类型在运行时是一致的,那么这个限制实际上不应该是问题(即,您实际上可以使用衍生工具代替基数):

在您的示例中,
MyDerived
中的
data
必须是
MyData[]
(否则您将破坏
MyBase
合同):


在TypeScript中没有这样做的方法。它基本上是一个运行时约束

在C#中,
new
意味着您实际上正在为函数创建一个新名称,该名称仅在遍历派生类型的表达式时可见,但在基类型的表达式中使用该名称仍然可以看到基成员(关键是在基案例实现本身中)

在TypeScript/JavaScript中,对象中只有一个“槽”,而派生类实际上正在覆盖基类的成员。覆盖该成员可能会破坏基类,因为基类无法引用它认为拥有的成员

Edit to add:您可以通过这种方式添加专门化,只要它们确实合理(与C#中相同,在C#中,如果您打破了基类形状,您通常只会使用
new
关键字)。如果您的类型在运行时是一致的,那么这个限制实际上不应该是问题(即,您实际上可以使用衍生工具代替基数):

在您的示例中,
MyDerived
中的
data
必须是
MyData[]
(否则您将破坏
MyBase
合同):


我正在为第三方库编写一个定义文件,该库更改派生类中的属性类型(javascript本身没有这样的限制,后果由开发人员自行决定).那么你是说没有办法在TypeScript中反映这种扭曲,不是吗?编辑以添加可以/不能执行此操作的示例我只是在为第三方库编写一个定义文件,该库更改派生类中的属性类型(javascript本身没有这样的限制,后果由开发人员自行决定)。所以你是说没有办法在TypeScript中反映这种扭曲,不是吗?编辑后添加了一些示例,说明你可以/不能这样做
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 */ }
declare class MyBase { data: any[]; }
declare class MyData { }
declare class MyDerived extends MyBase { data: MyData[]; /* OK */ }