是否可以更改在接口(interface)中声明的属性的类型?我不知道如何用语言解释这一点,所以这是我尝试做的一个简化示例,不起作用:
假设Movie
命名空间是在我无法控制的第三方库中定义的:
declare namespace Movie {
interface Character {
doSomething(): Promise<void>;
friend: Character;
}
}
现在,在我的应用程序中,我希望我的角色成为 super friend 。因此,我尝试使用自己的输入方式执行此操作:
declare namespace Movie {
interface Character {
doAnExtraThing(): Promise<void>; // OK to add a new method
nickname: string; // OK to add a new property
friend: SuperCharacter; // NOT OK to override type with a subtype
}
interface SuperCharacter extends Character {
doSomethingSuper(): Promise<void>;
}
}
但这不起作用,因为TypeScript不允许我用
friend
覆盖SuperCharacter
属性类型,即使根据定义,SuperCharacter
是也是Character
。 TypeScript提示此错误:[ts] Subsequent variable declarations must have the same type. Variable
'friend' must be of type 'Character', but here has type 'SuperCharacter'.
我希望通过
SuperCharacter
扩展原始的Character
接口(interface),我不会遇到这个问题,但是我确实有。希望很清楚我要实现的目标。有办法吗?
最佳答案
由于friend
已经是SuperCharacter
,因此没有理由明确指定SuperCharacter
可以是Character
。
因此,您可以完全删除此块:
界面字符{
friend :SuperCharacter;
}
作为证明,我们可以不使用接口(interface),而是使用可以正确编译的类查看实现:
class Character {
friend?: Character
constructor(friend?: Character) {
this.friend = friend
}
doSomething() {}
}
class SuperCharacter extends Character {
doSomethingSuper() {}
}
new Character(new Character())
new Character(new SuperCharacter())
new SuperCharacter(new Character())
new SuperCharacter(new SuperCharacter())