Mer*_*ott 5 types typescript typescript-typings
是否可以更改接口中声明的属性的类型?我不知道如何用文字解释这个,所以这里有一个简化的例子,说明我正在尝试做的事情是行不通的:
假设Movie命名空间是在我无法控制的第三方库中定义的:
declare namespace Movie {
interface Character {
doSomething(): Promise<void>;
friend: Character;
}
}
Run Code Online (Sandbox Code Playgroud)
现在在我的应用程序中,我希望我的角色成为Super,与超级朋友.所以我试着用我自己的打字方式做到这一点:
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>;
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为TypeScript不允许我覆盖friend属性类型SuperCharacter,即使定义a SuperCharacter 是 a Character.TypeScript抱怨此错误:
[ts] Subsequent variable declarations must have the same type. Variable
'friend' must be of type 'Character', but here has type 'SuperCharacter'.
Run Code Online (Sandbox Code Playgroud)
我希望通过SuperCharacter扩展原始Character界面我不会有这个问题,但我做到了.
希望很清楚我正在努力实现的目标.有办法吗?
没有理由明确指定friend可以是 aSuperCharacter因为SuperCharacter已经是 a Character。
所以你可以完全删除这个块:
界面角色 { 朋友:SuperCharacter; }
作为证明,我们可以放弃接口并查看可以正确编译的类的实现:
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())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |