我创建了一个高阶函数,该函数应接受类型为(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!"
答案 0 :(得分:3)
这不会导致编译错误,因为在JavaScript中,不接受任何参数的函数仅表示它不使用所提供的任何参数。
TypeScript合理地假设参数比预期签名少的函数会忽略额外的参数,因此,由于没有不匹配的参数类型且返回类型相同,因此签名仍然兼容。
此约定的一个实际示例是诸如Array.prototype.forEach()
之类的方法的回调函数。
如果TypeScript拒绝接受比回调期望更少的参数的函数,则您将始终必须提供一个接受参数index
和array
的回调,这对开发人员来说是非常不便的立场。
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)
请注意,这些不是不是 可选参数,它们是指调用该函数时可能会或可能不会提供的参数。在这种情况下,总是提供参数 ,但是函数不一定必须使用它们。