3 回答
TA贡献1794条经验 获得超7个赞
当您将不正确数量的参数传递给匿名函数时,有时会发生这种情况:
Object.keys(data).reduce((key: string) => {
}, {});
会引发错误:
没有重载匹配这个调用。重载 1 of 3
将正确数量的参数传递给它:
Object.keys(data).reduce((acc: any, key: string) => {
}, {});
TA贡献1851条经验 获得超3个赞
我也有这个奇怪的问题,但我使用类型断言(在我的例子中使用字符串枚举)解决了它:
(Object.values(someEnum) as string[]).concat(otherStringArray);
TA贡献1829条经验 获得超13个赞
解决方案 1:保留数字枚举 signals
Object.values(signals)
// numeric enum includes reverse mapping, filter numbers out and keep "SIGHUP" etc.
.filter((s): s is NodeJS.Signals => typeof s !== "number")
.forEach(signal => {
process.on(signal, ...) // works now
})
解决方案 2:使用纯信号字符串文字类型
// these string literal items are strongly typed by built-in NodeJS.Signals type
Object.values<NodeJS.Signals>(["SIGHUP", "SIGINT", "SIGTERM"])
.forEach(signal => {
process.on(signal, ...) // works now
})
方案三:改成字符串枚举(无反向映射)
enum signals2 {
SIGHUP = "SIGHUP",
SIGINT = "SIGINT",
SIGTERM = "SIGTERM"
}
Object.values(signals2)
.forEach(signal => {
process.on(signal, ...) // works now
})
为什么会发生错误?
数字枚举signals包括反向映射。例如,您可以执行以下操作:
const r1 = signals.SIGHUP // r1 value: 1
const r2 = signals[signals.SIGINT] // r2 value: "SIGINT"
const r3 = signals[15] // r3 value: "SIGTERM"
这就是为什么你(string | signals)[]回来 for Object.values(signals), wherestring代表枚举键和signals枚举值。
现在,参数signalinprocess.on(signal, ...)必须是预定义的 Node.JS 字符串文字类型之一。但是我们传入了string | signals项目类型,所以 TS 在这一点上大喊大叫。
添加回答
举报