我正在使用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天前,而不是现在。
6条答案
按热度按时间dpiehjr41#
当您传递给匿名函数的参数数目不正确时,有时会发生这种情况:
将引发错误:
没有与此调用匹配的重载。重载1/3
向其传递正确数量的参数:
e3bfsja22#
我也遇到过这个奇怪的问题,但是我使用类型Assert(在我的例子中使用了字符串枚举)解决了这个问题:
zy1mlcev3#
溶液1:保留数字枚举
signals
溶液2:使用纯信号字符串文本类型
溶液3:更改为字符串枚举(无反向Map)
为什么会发生错误?
像
signals
这样的数字枚举包括反向Map。例如,您可以执行以下操作:这就是为什么要将
Object.values(signals)
恢复为(string | signals)[]
的原因,其中string
代表枚举键,signals
代表枚举值。现在,
process.on(signal, ...)
中的参数signal
必须是预定义的Node.JS字符串类型之一,但是我们传入了string | signals
项目类型,所以TS在这一点上大叫。ctehm74n4#
当您没有正确分配类型时,就会发生这种情况。
您的变量数据类型必须与传递的数据类型匹配。
zed5wv105#
关于这种错误,我遇到过一个奇怪的情况,例如
改用
因为
replace
中的第二个参数是string类型。2w2cym1i6#
当我将一个非异步函数传递给一个需要异步函数的方法时,我遇到了这种类型的打字错误。