TypeScript声明合并 - 更改属性类型

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界面我不会有这个问题,但我做到了.

希望很清楚我正在努力实现的目标.有办法吗?

fny*_*fny 1

没有理由明确指定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)