为什么接口中的 Typescript 返回类型 void 不会触发实现中的错误?



我正在 Typescript 操场中尝试两个不同的类来实现相同的接口。我无法弄清楚为什么接口中具有void返回类型的方法speak()如果它的实现返回 void 以外的内容,则不会触发错误。

我必须显式实现具有返回类型void的方法以触发类型检查。对于void以外的返回类型,这似乎不会发生,如下所示。

打字稿操场中的代码段

interface Person {
speak(): void;
walk(): number;
}
export class HumanOne implements Person {
speak() {
return 'Hello';   // No type error
}
walk() {
return 'Walking'; // Type error
}
}
export class HumanTwo implements Person {
speak(): void {
return 'Hello';   // Type error
}
walk(): number {
return 'Walking'; // Type error
}
}

没有显式类型声明的方法的推断类型是HumanOne.speak(): string。这与void兼容,它有两个含义:

  • 在返回类型为void的函数实现中,这意味着它不返回任何内容,或多或少等同于将undefined指定为返回类型。
  • 在函数类型声明中,void表示可以返回任何内容,并且不得使用调用的返回值。就类型兼容性而言,它或多或少等同于unknown(但与unknown不同的是,您不能真正传递类型void的值)。

这第二个含义也是与HumanOne implements Person的子类型检查相关的 - 类型() => string是子类型(或:可分配给)类型() => void。如果调用Person.speak(),则必须忽略返回值(它可能是undefined、字符串或其他任何内容);如果你打电话给HumanOne.speak()你就会知道你得到了一个字符串。

这在很大程度上是设计使然,请参阅返回类型的文档void 和常见问题条目"为什么返回非 void 的函数可分配给返回 void 的函数?"。

最新更新