为了账号安全,请及时绑定邮箱和手机立即绑定

没有重载匹配这个调用。“字符串”类型不可分配给“信号”类型

没有重载匹配这个调用。“字符串”类型不可分配给“信号”类型

猛跑小猪 2021-09-30 09:49:11
我正在使用打字稿来构建微服务并处理信号。直到几天前,代码都运行良好,但最近它开始抛出错误。找不到解决此问题的方法。处理信号的代码。它只是文件的一部分。 src/main.ts  enum signals {    SIGHUP = 1,    SIGINT = 2,    SIGTERM = 15  }  const shutdown = (signal, value) => {    logger.warn("shutdown!")    Db.closeAll()    process.exit(value)  }  Object.values(signals).forEach(signal => {    process.on(signal, () => {      logger.warn(`process received a ${signal} signal`)      shutdown(signal, signals[signal])    })  })当我执行ts-node src/main.ts以下错误并退出时。/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:245    return new TSError(diagnosticText, diagnosticCodes)           ^TSError: ⨯ Unable to compile TypeScript:src/main.ts:35:16 - error TS2769: No overload matches this call.  The last overload gave the following error.    Argument of type 'string | signals' is not assignable to parameter of type 'Signals'.      Type 'string' is not assignable to type 'Signals'.任何修复将不胜感激。或者,如果您能说出为什么它在 2 天前更早起作用而不是现在起作用。
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

当您将不正确数量的参数传递给匿名函数时,有时会发生这种情况:


    Object.keys(data).reduce((key: string) => {


    }, {}); 

会引发错误:


没有重载匹配这个调用。重载 1 of 3


将正确数量的参数传递给它:


    Object.keys(data).reduce((acc: any, key: string) => {

    }, {});


查看完整回答
反对 回复 2021-09-30
?
皈依舞

TA贡献1851条经验 获得超3个赞

我也有这个奇怪的问题,但我使用类型断言(在我的例子中使用字符串枚举)解决了它:

(Object.values(someEnum) as string[]).concat(otherStringArray);


查看完整回答
反对 回复 2021-09-30
?
烙印99

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 在这一点上大喊大叫。


查看完整回答
反对 回复 2021-09-30
  • 3 回答
  • 0 关注
  • 491 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信