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

Adv*_*kar 9 javascript typescript

我正在 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
  }
}
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 11

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

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

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

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