Zu diesem Aufruf passt keine Überladung. Der Typ „String“ kann nicht dem Typ „Signale“ zugewiesen werden.

Lesezeit: 5 Minuten

MA SIDDIQUIs Benutzeravatar
MA SIDDIQUI

Ich verwende Typoskript, um einen Microservice zu erstellen und auch Signale zu verarbeiten. Der Code funktionierte bis vor ein paar Tagen einwandfrei, aber seit kurzem gibt er Fehler aus. Es konnte keine Lösung für das Problem gefunden werden.

Code zur Verarbeitung von Signalen. Es ist nur ein Teil der Datei.
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])
    })
  })

Wenn ich es tue ts-node src/main.ts Der folgende Fehler wird ausgelöst und beendet.


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

Jede Lösung wäre dankbar. Oder wenn Sie sagen können, warum es vor 2 Tagen früher funktionierte und jetzt nicht.

  • Ist process.on() Erwarten Sie, dass das erste Argument eine Zahl oder eine Zeichenfolge ist? Laut Dokumentation sieht es so aus, als ob es sich um eine Zeichenfolge handeln sollte. Object.values(signals) gibt ein Array von Zahlen zurück. Ich denke, du willst Object.keys(signals)und ich vermute, was sich in den letzten zwei Tagen geändert hat, ist, dass Sie die Enum-Werte auf Zahlen statt auf konstante Zeichenfolgen setzen.

    – dx_over_dt

    20. September 2019 um 18:20 Uhr

  • Solange ich über Enum spreche, das sich schon lange nicht mehr geändert hat, dachte ich, dass die Zahl vielleicht ein Problem verursacht, und habe sie in einen String konvertiert, aber es hat immer noch nicht funktioniert.

    – MA SIDDIQUI

    21. September 2019 um 8:43

  • Versuchen Sie, von zu wechseln Object.values() Zu Object.keys()

    – dx_over_dt

    21. September 2019 um 21:46 Uhr

Dies passiert manchmal, wenn Sie einer anonymen Funktion eine falsche Anzahl von Argumenten übergeben haben:

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

    }, {}); 

wird einen Fehler auslösen:

Zu diesem Aufruf passt keine Überladung. Überladung 1 von 3

Übergeben Sie ihm die richtige Anzahl an Argumenten:

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

  • Ich hatte die gleiche Meldung „Keine Überlastung entspricht diesem Anruf.“ Das lag daran, dass ich nicht die richtige Anzahl an Parametern übergeben habe.

    – Vesko Vujovic

    22. Okt. 2020 um 6:26

Ich hatte auch dieses seltsame Problem, aber ich habe es mithilfe von Typzusicherungen (in meinem Fall mithilfe einer String-Enumeration) umgangen:

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

  • Könnten Sie bitte etwas näher erläutern, wie Sie das Problem gelöst haben? Vielleicht könnten Sie bitte auch mit stackoverflow.com/questions/58502778 helfen?

    – B–rian

    22. Okt. 2019 um 11:04 Uhr


Benutzeravatar von ford04
ford04

Lösung 1: Behalten numerische Aufzählung 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
  })

Lösung 2: Verwenden Sie reine Signalzeichenfolgen-Literaltypen

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

Lösung 3: Wechseln Sie zu String-Aufzählung (keine umgekehrte Zuordnung)

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

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

Warum tritt der Fehler auf?

Numerische Aufzählungen wie signals umfassen a umgekehrte Zuordnung. Sie können beispielsweise Folgendes tun:

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

Deshalb bekommen Sie (string | signals)[] zurück für Object.values(signals)Wo string steht für die Enum-Schlüssel und signals für die Enum-Werte.

Nun, Parameter signal In process.on(signal, ...) muss einer von denen sein vordefinierte Node.JS-String-Literal-Typen. Wir gehen jedoch vorbei string | signals Artikeltyp, also schreit TS an dieser Stelle.

Benutzeravatar von KasunSH
KasunSH

Dies geschieht, wenn Sie Ihre Typen nicht richtig zuweisen.

Ihr variabler Datentyp MUSS mit dem übergebenen Datentyp übereinstimmen.

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
  }

Ein seltsamer Fall, der mir in Bezug auf diese Art von Fehler passiert ist, könnte zum Beispiel sein

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

stattdessen verwenden

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

weil das zweite Argument in replace ist vom Typ string.

Benutzer-Avatar von BT
BT

Ich habe einen Typoskriptfehler dieser Art erhalten, als ich eine nicht asynchrone Funktion an eine Methode übergeben habe, die eine asynchrone Funktion erwartet hat.

1452690cookie-checkZu diesem Aufruf passt keine Überladung. Der Typ „String“ kann nicht dem Typ „Signale“ zugewiesen werden.

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy