NodeJS 没有与此调用匹配的重载,类型“string”不能赋给类型“Signals”

2ul0zpep  于 2023-01-12  发布在  Node.js
关注(0)|答案(6)|浏览(181)

我正在使用typescript来建立一个微服务,同时也处理信号。代码直到几天前都运行良好,但是最近开始抛出错误。找不到解决这个问题的方法。
处理信号的代码。它只是文件的一部分。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'.

35     process.on(signal, () => {
                  ~~~~~~

  node_modules/@types/node/base.d.ts:653:9
    653         on(event: Signals, listener: SignalsListener): this;
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    The last overload is declared here.

    at createTSError (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:245:12)
    at reportTSError (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:249:19)
    at getOutput (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:362:34)
    at Object.compile (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:395:32)
    at Module.m._compile (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:473:43)
    at Module._extensions..js (module.js:663:10)
    at Object.require.extensions.(anonymous function) [as .ts] (/home/meraj/.nvm/versions/node/v8.10.0/lib/node_modules/ts-node/src/index.ts:476:12)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)

任何修复将不胜感激。或者如果你能告诉为什么它是工作早在2天前,而不是现在。

dpiehjr4

dpiehjr41#

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

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

    }, {});

将引发错误:
没有与此调用匹配的重载。重载1/3
向其传递正确数量的参数:

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

e3bfsja22#

我也遇到过这个奇怪的问题,但是我使用类型Assert(在我的例子中使用了字符串枚举)解决了这个问题:

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

zy1mlcev3#

溶液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
  })

溶液3:更改为字符串枚举(无反向Map)

enum signals2 {
  SIGHUP = "SIGHUP",
  SIGINT = "SIGINT",
  SIGTERM = "SIGTERM"
}

Object.values(signals2)
  .forEach(signal => {
    process.on(signal, ...) // works now
  })

为什么会发生错误?

signals这样的数字枚举包括反向Map。例如,您可以执行以下操作:

const r1 = signals.SIGHUP // r1 value: 1
const r2 = signals[signals.SIGINT] // r2 value: "SIGINT"
const r3 = signals[15] // r3 value: "SIGTERM"

这就是为什么要将Object.values(signals)恢复为(string | signals)[]的原因,其中string代表枚举键,signals代表枚举值。
现在,process.on(signal, ...)中的参数signal必须是预定义的Node.JS字符串类型之一,但是我们传入了string | signals项目类型,所以TS在这一点上大叫。

ctehm74n

ctehm74n4#

当您没有正确分配类型时,就会发生这种情况。
您的变量数据类型必须与传递的数据类型匹配。

organizationList: { id: string; name: string;  }[] = [] //if you do this way it type error
organizationList: Organization[] = [] //correct defining method 

get Org() {
    return this.list.filter((org: Organization) => org.id == this.id) //this data type must defined data type
  }
zed5wv10

zed5wv105#

关于这种错误,我遇到过一个奇怪的情况,例如

somePath = somePath.replace(/\//g, /\\\//g);

改用

somePath= somePath.replace("/", "\/");
somePath= somePath.replace(/\//, "\/");

因为replace中的第二个参数是string类型。

2w2cym1i

2w2cym1i6#

当我将一个非异步函数传递给一个需要异步函数的方法时,我遇到了这种类型的打字错误。

相关问题