typescript - 不带参数的高阶函数的编译行为
问题描述
我创建了一个高阶函数,它应该接受 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!"
解决方案
这不会导致编译错误,因为在 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)
请注意,这些不是 可选参数,它们是指调用函数时可能提供或不提供的参数。在这种情况下,始终提供参数,但函数不一定必须使用它们。
推荐阅读
- git - 解决 git pull (错误:“将覆盖本地更改”),如合并冲突
- c# - 使用 GECKO FX c# 的内容文档 iframe 始终为空
- php - 在 Vuejs 组件中使用 PHP 变量
- excel - 代替外部链接,我们需要内部链接 b/w 合并的工作簿,使用 VBA
- javascript - DFR 简单 jwt 从用户实例而不是用户名/密码获取 authToken
- excel - 查找功能很奇怪
- vba - 使用 VBA 抓取历史数据表
- javascript - HTML onUnclick 处理程序?
- vagrant - MacOs Big Sur 升级时遇到 Vagrant Up 错误
- javascript - 如果用户单击 d3.js 中的圆形,如何防止拖动?