我正在 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 的函数?"。