TypeScript类型化的函数void不应编译

时间:2018-11-02 16:36:26

标签: typescript

在下面的四个函数中,前两个函数正确返回一个数字,然后TypeScript编译器对其进行编译。

第三个可以正确地导致TypeScript编译错误,但是即使我预期会出现第四个错误,也不会?

// OK
let addNumbers: (a: number, b: number, c: number) => number = function (a, b, c) {
    return a + b + c;
};

// OK
let addNumbersTwo = function (a: number, b: number, c: number): number {
    return a + b + c;
};

// Correct compilation error
let addNumbersThree = function (a: number, b: number, c: number): void {
    return a + b + c;
};

// Should not compile? Should give same error as addNumbersThree above
let addNumbersFour: (a: number, b: number, c: number) => void = function (a, b, c) {
    return a + b + c;
};

TypeScript Playground example

1 个答案:

答案 0 :(得分:5)

这是因为(whatever) => whatever可分配给(whatever) => void

由于期望void返回函数会丢弃它具有的任何不存在的返回值。

someVoidReturningFunction(args); // result doesn't get assigned or used.

实际上someVoidReturningFunction是否确实返回一个值并被丢弃就没关系。

简而言之:为函数提供明确的返回值void表示使用代码不应该关心返回的结果

下面是the docs的示例:

function callMeMaybe(callback: () => void) {
    callback();
}
let items = [1, 2];
callMeMaybe(() => items.push(3));

从技术上讲,items.push(3)将返回一个数字(length中新的items)。但是,指定一个void回调实际上允许我们传递带有任何返回值的回调,并指示该返回值将被丢弃。


相同的理由适用于缺少的参数。

let foo: ((a: number, b: number) => number) = () => 42; // compiles

因为即使实际上没有使用这些变量,您仍然可以调用foo(1, 2)并获得一个数字。