是否可以更改在接口(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())

10-08 15:47