J'utilise TypeScript pour créer un micro-service et gérer également les signaux. Le code fonctionnait bien jusqu'à il y a quelques jours mais récemment, il a commencé à générer des erreurs. Impossible de trouver un correctif pour le problème.
code de gestion des signaux. Ce n'est qu'une partie du dossier. 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])
})
})
Quand je fais ts-node src/main.ts
L'erreur suivante se lève et échoue et quitte.
/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)
Tout correctif serait apprécié. Ou si vous pouvez dire pourquoi cela fonctionnait plus tôt il y a seulement 2 jours et pas maintenant.
J'ai également eu ce problème étrange, mais je l'ai contourné en utilisant des assertions de type (dans mon cas, en utilisant une énumération de chaîne):
(Object.values(someEnum) as string[]).concat(otherStringArray);
Cela se produit parfois lorsque vous avez transmis un nombre incorrect d'arguments à une fonction anonyme:
Object.keys(data).reduce((key: string) => {
}, {});
générera une erreur:
Aucune surcharge ne correspond à cet appel. Surcharge 1 sur 3
Passez-lui le nombre correct d'arguments:
Object.keys(data).reduce((acc: any, key: string) => {
}, {});
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
})
// 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
})
Les énumérations numériques comme signals
incluent un reverse mapping . Par exemple, vous pouvez effectuer les opérations suivantes:
const r1 = signals.SIGHUP // r1 value: 1
const r2 = signals[signals.SIGINT] // r2 value: "SIGINT"
const r3 = signals[15] // r3 value: "SIGTERM"
C'est pourquoi vous récupérez (string | signals)[]
Pour Object.values(signals)
, où string
représente les clés enum et signals
pour les valeurs enum.
Maintenant, le paramètre signal
dans process.on(signal, ...)
doit être l'un des types littéraux de chaîne Node.JS prédéfinis . Cependant, nous passons le type d'élément string | signals
, Donc TS crie à ce stade.