Typoskript-Duplizierungsfunktionsimplementierung

Lesezeit: 3 Minuten

Ich habe die folgenden zwei Funktionssignaturen in derselben Typescript-Klasse definiert, dh

public emit<T1>(event: string, arg1: T1): void {}

und

public emit<T1,T2>(event: string, arg1: T1, arg2: T2): void {}

Beim Transpilieren des Typoskripts erhalte ich jedoch die folgende Fehlermeldung

error TS2393: Duplicate function implementation.

Ich dachte, Sie könnten Funktionen in Typoskript überladen, vorausgesetzt, die Anzahl der Parameter in der Funktionssignatur wäre unterschiedlich. Angesichts der Tatsache, dass die obigen Signaturen 2 bzw. 3 Parameter haben, warum erhalte ich diesen Transpilationsfehler?

  • In Typoskript gibt es keine Funktionsüberladung, auch nicht ohne Generika.

    – Tamas Hegedus

    25. September 2016 um 17:44 Uhr

  • Bitte lesen Sie die Dokumentation zum Thema Überladen genauer durch. Überladen bedeutet nicht, dass Sie mehrere bereitstellen können Implementierungen; es bedeutet, dass Sie mehrere bereitstellen können Unterschriften, mit einer einzigen Implementierung. Aber warum schreibst du in diesem Fall nicht einfach? arg2??

    Benutzer663031

    25. September 2016 um 17:46 Uhr


  • @torazaburo. Ich versuche, Typsicherheit durch Generika zu gewährleisten. Wenn ich benutze arg2? Ich muss noch den generischen Typ bereitstellen T2 in emit<T1,T2> auch wenn ich es vielleicht gar nicht nutze T2. Ich denke, ich versuche, etwas Ähnliches wie c# zu erreichen Func und Action Unterschriften delegieren. Aber es könnte einen besseren Weg geben.

    – Jakob B

    25. September 2016 um 17:54 Uhr


  • Wenn Sie sich auf die Bereitstellung des generischen Typs beziehen T2 in dem Definition der Funktion schadet das nichts. Wenn Sie sich darauf beziehen Berufung die Funktion, die einen beliebigen Typ bereitstellt, wie in emit<number, string> sollte nicht notwendig sein, da die Typen von den Typen der Argumente übernommen werden. Wie auch immer, wenn nötig, schreiben Sie die beiden Deklarationen ohne Körper (nur ein Semikolon) aus und schreiben Sie dann eines Implementierung, die irgendwie auf das Vorhandensein von prüft arg2oder weist ihm vielleicht einen Standardwert zu.

    Benutzer663031

    25. September 2016 um 18:03 Uhr


  • Beantwortet das deine Frage? TypeScript-Funktion überladen

    – Weg

    22. Juli um 10:49 Uhr

Ich nehme an, dein Code sieht so aus:

public emit<T1>(event: string, arg1: T1): void {}
public emit<T1,T2>(event: string, arg1: T1, arg2: T2): void {}
public emit(event: string, ...args: any[]): void {
    // actual implementation here
}

Das Problem ist, dass Sie haben {} nach den ersten 2 Zeilen. Dies definiert tatsächlich ein leere Implementierung einer Funktion, also so etwas wie:

function empty() {}

Sie wollen nur a definieren Typ für die Funktion, nicht ein Implementierung. Ersetzen Sie also die leeren Blöcke durch nur ein Semikolon:

public emit<T1>(event: string, arg1: T1): void;
public emit<T1,T2>(event: string, arg1: T1, arg2: T2): void;
public emit(event: string, ...args: any[]): void {
    // actual implementation here
}

  • Wenn Sie in TypeScript überladen, haben Sie nur eine Implementierung mit mehreren Signaturen. Siehe stackoverflow.com/questions/13212625/…

    – Matthäus K

    25. Juni 2018 um 16:08 Uhr

  • Also, wenn diese drei Funktionen unterschiedliche Logiken enthalten?

    – Prashant Pimpale

    1. Februar 2019 um 7:57 Uhr

  • Es gibt drei Signaturen, aber nur eine Implementierung. Wenn Sie je nach verwendeter Signatur eine andere Logik benötigen, müssen Sie einige zusätzliche Überprüfungen in Ihrer Implementierung hinzufügen. Sie könnten zum Beispiel prüfen args.length herauszufinden, ob nur arg1 bestanden wurde oder beides arg1 und arg2 Wurden verabschiedet.

    – Mattias Bülens

    5. Februar 2019 um 16:00 Uhr

  • Dies sind alles leere Funktionen. Aber was tun mit generischen Rückgabewerten. Was ist beispielsweise, wenn der Rückgabetyp der ersten Überladung lautet T1 (oder string), während der zweite Überladungsrückgabetyp if T2?

    – Ark-kun

    28. Juni um 2:03

export {}

Fügen Sie einfach diese Zeile oben in der Typoskript-Datei hinzu

  • Es klappt. Die Frage ist: Warum? 🙂

    – Andreas Susewind

    29. Januar um 17:06 Uhr

  • “Eine weitere Fehlerursache ist ein Fehler aufgrund von Legacy-Skriptdateien. Wenn Sie nur eine einzige Definition für die Funktion in der Datei haben, fügen Sie Ihrer Datei die Zeile export {} hinzu, um sie zu einem ES-Modul zu machen.” dieses Blog

    – aditya tyagi

    19. Juni um 15:42 Uhr


1404560cookie-checkTyposkript-Duplizierungsfunktionsimplementierung

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

Privacy policy