我想知道为什么下面的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返回类型?应该是吗这是编译器中的错误还是预期的行为?
谢谢!
答案 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