为什么()=> Promise <undefined>可分配给()=> void?

时间:2020-04-29 14:58:19

标签: typescript

为什么这不会导致编译器错误?

function foo(): () => void {
    return () => Promise.resolve();
}

这种特殊情况很重要,因为当一个函数返回一个promise时,调用者应该知道在promise解决或拒绝之前,该函数不会“完成”。

承诺与为什么这是我正在查看的代码库中的问题有关,但是void和函数类型的组合似乎得到了我不理解的一般待遇。为什么第一行出现以下错误,而不出现第二行?

const y: void = 3;             // error
const x: () => void = () => 3; // OK

我误解了这种现象吗?这是TypeScript错误吗?

1 个答案:

答案 0 :(得分:4)

一个简单的原理:如果您将() => void用作回调类型,则意味着您不会期望返回值。

您只想执行不带参数的函数。

因此,由于您通常也可以调用返回 something 的函数,然后忽略返回的值,因此可以使用任何返回某物的函数代替标记为return {{ 1}}。

就其他语言而言,返回的类型对于编译很重要,这可能令人惊讶。但是,考虑到TypeScript扎根于JavaScript,并且无论如何,返回“ nothing”(void)的函数实际上返回function f() { return; }。因此,从这种角度来看,所有JS函数都会以某种方式返回某种结果。

这是直接来自TypeScript FAQ的类似解释:

另一种思考方式是,返回void的回调类型显示“如果有返回值,我将不查看您的返回值”。

因此,undefined的意思是“对返回的类型没有限制”。

如果您想禁止任何返回的类型,请使用void,这是无论如何都将返回的最小类型,即使通过() => undefined函数也是如此。 / p>