29
votes

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

J'utilise dactylographié pour créer un microservice et gérer les signaux également. 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 traitement des signaux. C'est juste une partie du dossier. 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)

Quand je fais ts-node src/main.ts L'erreur suivante se lance et se ts-node 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])
    })
  })

N'importe quelle solution serait appréciée. Ou si vous pouvez dire pourquoi cela fonctionnait plus tôt il y a seulement 2 jours et pas maintenant.


3 commentaires

process.on() s'attend-il à ce que son premier argument soit un nombre ou une chaîne? Selon la documentation, il semble que ce devrait être une chaîne. Object.values(signals) renvoie un tableau de nombres. Je pense que vous voulez Object.keys(signals) , et je suppose que ce qui a changé au cours des deux derniers jours, c'est que vous définissez les valeurs d'énumération sur des nombres plutôt que sur des chaînes constantes.


Tant que je parle d'énumération qui n'est pas modifiée depuis assez longtemps, et j'ai pensé que peut-être le nombre créait un problème et je l'ai converti en chaîne, mais cela n'a toujours pas fonctionné.


Essayez de passer de Object.values() à Object.keys()


3 Réponses :


7
votes

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 chaîne enum):

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


1 commentaires

Pouvez-vous expliquer un peu comment vous l'avez résolu? Peut-être pourriez-vous également aider avec stackoverflow.com/questions/58502778 s'il vous plaît?



5
votes

Cela se produit parfois lorsque vous avez passé un nombre incorrect d'arguments à une fonction anonyme:

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

soulèvera une erreur:

Aucune surcharge ne correspond à cet appel. Surcharge 1 sur 3

Passez-lui le nombre correct d'arguments:

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

    }, {}); 


1 commentaires

J'ai eu le même message "Aucune surcharge ne correspond à cet appel." C'était parce que je n'ai pas réussi le bon nombre de paramètres.



1
votes

Solution 1: conserver les signals énumération numériques
const r1 = signals.SIGHUP // r1 value: 1
const r2 = signals[signals.SIGINT] // r2 value: "SIGINT"
const r3 = signals[15] // r3 value: "SIGTERM"

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

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

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

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

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

Pourquoi l'erreur se produit-elle?

Les énumérations numériques comme les signals incluent un mappage inverse . Par exemple, vous pouvez effectuer les opérations suivantes:

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

C'est pourquoi vous récupérez (string | signals)[] pour Object.values(signals) , où string représente les clés d'énumération et les signals pour les valeurs d'énumération.

Désormais, le paramètre signal dans process.on(signal, ...) doit être l'un des types de littéraux de chaîne Node.JS prédéfinis . Cependant on passe en string | signals type d'élément, donc TS crie à ce stade.


0 commentaires