首页 > 解决方案 > 不带参数的高阶函数的编译行为

问题描述

我创建了一个高阶函数,它应该接受 type 的函数(n: number) => string。但是,当我传入一个 type 的函数时() => string,如下所示,我没有收到编译错误。为什么是这样?

function stringFunction() {
    return "Hello World!";
}

stringFunction(); // returns "Hello World!"

function transformStringFunction(func: (n: number) => string) {
    return function() {
        const returnedString = func(10);
        return returnedString + " Transformed!";
    };
}

// why is this allowed? `stringFunction` has no arguments.
const transformedFunction = transformStringFunction(stringFunction);

transformedFunction(); // returns "Hello World! Transformed!"

标签: typescript

解决方案


这不会导致编译错误,因为在 JavaScript 中,不接受参数的函数只是意味着它不使用提供的任何参数。

TypeScript 合理地假设参数少于预期签名的函数会简单地忽略额外的参数,因此签名仍然兼容,因为没有不匹配的参数类型并且返回类型相同。

这种约定的一个实际例子是方法的回调函数,如Array.prototype.forEach().

如果 TypeScript 拒绝接受的参数少于回调预期的函数,您将始终必须提供一个接受参数的回调indexarray,从开发人员的角度来看,这将非常不方便。

const array = [1, 2, 3, 4]
// imagine if this resulted in an error
array.map(n => n * 2)
// and you were required to provide this instead
array.map((n, i, a) => n * 2)

请注意,这些不是 可选参数,它们是指调用函数时可能提供或不提供的参数。在这种情况下,始终提供参数,但函数不一定必须使用它们。


推荐阅读