web-dev-qa-db-fra.com

Aucune surcharge ne correspond à cet appel. Le type 'chaîne' n'est pas assignable au type 'Signaux'

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.

19
M A SIDDIQUI

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);
3
kitsu.eb

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) => {
    }, {});
0
Donato

Solution 1: conserver énumération numériquesignals

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

Solution 2: utiliser des types littéraux de chaîne de signal purs

// 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
  })

Solution 3: passez à énumération de chaînes (pas de mappage inversé)

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

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

Pourquoi l'erreur se produit-elle?

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.

0
ford04