Adv*_*kar 9 javascript typescript
我正在 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
}
}
Run Code Online (Sandbox Code Playgroud)
Ber*_*rgi 11
没有显式类型声明的方法的推断类型是HumanOne.speak(): string。这与 兼容void,有两层含义:
void,这意味着它不返回任何内容,或多或少相当于指定undefined为返回类型。void意味着可以返回任何内容,并且不得使用调用的返回值。unknown就类型兼容性而言,它或多或少等效(但与 不同的是unknown,您不能真正传递 type 的值void)。第二个含义也是与子类型检查相关的内容HumanOne implements Person- 类型() => string是子类型(或:可分配给)类型() => void。如果调用Person.speak(),则必须忽略返回值(它可能是undefined、字符串或其他任何值);如果你打电话,HumanOne.speak()你就会知道你会收到一条字符串。
这很大程度上是设计使然,请参阅有关返回类型 void 的文档和常见问题解答条目“为什么返回非 void 的函数可分配给返回 void 的函数? ”。