繁体   English   中英

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

[英]Why Typescript return type void in interface doesn't trigger error in implementation?

我正在 Typescript 操场上尝试两个不同的类,它们实现了相同的接口。 我不明白为什么接口中返回类型为void的方法speak()不会触发错误,如果它的实现返回 void 以外的内容。

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

Typescript Playground 中的片段

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM