没有参数的高阶函数的编译行为

时间:2018-09-20 19:44:01

标签: typescript

我创建了一个高阶函数,该函数应接受类型为(n: number) => string的函数。但是,当我按如下所示传递类型为() => 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!"

1 个答案:

答案 0 :(得分:3)

这不会导致编译错误,因为在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)

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

相关问题