为什么这不会导致编译器错误?
function foo(): () => void {
return () => Promise.resolve();
}
这种特殊情况很重要,因为当一个函数返回一个promise时,调用者应该知道在promise解决或拒绝之前,该函数不会“完成”。
承诺与为什么这是我正在查看的代码库中的问题有关,但是void
和函数类型的组合似乎得到了我不理解的一般待遇。为什么第一行出现以下错误,而不出现第二行?
const y: void = 3; // error
const x: () => void = () => 3; // OK
我误解了这种现象吗?这是TypeScript错误吗?
答案 0 :(得分:4)
一个简单的原理:如果您将() => void
用作回调类型,则意味着您不会期望返回值。
您只想执行不带参数的函数。
因此,由于您通常也可以调用返回 something 的函数,然后忽略返回的值,因此可以使用任何返回某物的函数代替标记为return {{ 1}}。
就其他语言而言,返回的类型对于编译很重要,这可能令人惊讶。但是,考虑到TypeScript扎根于JavaScript,并且无论如何,返回“ nothing”(void
)的函数实际上返回function f() { return; }
。因此,从这种角度来看,所有JS函数都会以某种方式返回某种结果。
这是直接来自TypeScript FAQ的类似解释:
另一种思考方式是,返回void的回调类型显示“如果有返回值,我将不查看您的返回值”。
因此,undefined
的意思是“对返回的类型没有限制”。
如果您想禁止任何返回的类型,请使用void
,这是无论如何都将返回的最小类型,即使通过() => undefined
函数也是如此。 / p>