在下面的四个函数中,前两个函数正确返回一个数字,然后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;
};
答案 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)
并获得一个数字。