为什么我可以在抽象方法的实现中用非void覆盖void返回类型(反之亦然)?

时间:2018-10-24 14:20:45

标签: typescript

我想知道为什么下面的TypeScript代码编译时没有错误或警告(使用tsc)。

abstract class A {
  abstract foo(): void;
}

class B extends A {
  foo(): number { // this is fine?
    return 1;
  }
}

我似乎能够使用具有无效返回类型的抽象方法创建抽象类,但是实现类可以使用非无效返回类型,并且仍然算作实现所述抽象方法。

另一方面,我(正确地认为)不允许 声明具有非无效返回类型的抽象方法,并在实现(或任何类型)中使用void返回类型与声明不同)。

abstract class A {
  abstract foo(): string;
}

class B extends A {
  foo(): void {
    console.log('does not compile');
  }
}

为什么可以覆盖void返回类型?应该是吗这是编译器中的错误还是预期的行为?

谢谢!

1 个答案:

答案 0 :(得分:1)

根据打字稿规范:

  

Void类型是Any类型的子类型

因此我们可以推断void的行为很像any,因为它是它的子类型,也就是说,您可以将void类型重新定义(缩小)为{{ 1}},就像string

P.S。 TS文档或规范中的any信息不多。

https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#325-the-void-type