Abschnitt 6.3 der TypeScript-Sprachspezifikation befasst sich mit der Überladung von Funktionen und gibt konkrete Beispiele für deren Implementierung. Wenn ich jedoch so etwas versuche:
export class LayerFactory {
constructor (public styleFactory: Symbology.StyleFactory) { }
createFeatureLayer (userContext : Model.UserContext, mapWrapperObj : MapWrapperBase) : any {
throw "not implemented";
}
createFeatureLayer(layerName : string, style : any) : any {
throw "not implemented";
}
}
Ich erhalte einen Compilerfehler, der auf eine doppelte Kennung hinweist, obwohl die Funktionsparameter unterschiedlich sind. Selbst wenn ich der zweiten Funktion createFeatureLayer einen zusätzlichen Parameter hinzufüge, wird immer noch ein Compilerfehler angezeigt. Ideen bitte.
typescript
overloading
Klaus Nji
quelle
quelle
Antworten:
Dies kann daran liegen, dass beim Kompilieren beider Funktionen zu JavaScript die Signatur völlig identisch ist. Da JavaScript keine Typen hat, erstellen wir am Ende zwei Funktionen mit der gleichen Anzahl von Argumenten. TypeScript hindert uns also daran, solche Funktionen zu erstellen.
TypeScript unterstützt das Überladen basierend auf der Anzahl der Parameter, aber die zu befolgenden Schritte unterscheiden sich etwas, wenn wir sie mit OO-Sprachen vergleichen. Als Antwort auf eine andere SO-Frage erklärte es jemand mit einem schönen Beispiel: Methodenüberladung? .
Grundsätzlich erstellen wir nur eine Funktion und eine Reihe von Deklarationen, damit TypeScript keine Kompilierungsfehler verursacht. Wenn dieser Code in JavaScript kompiliert wird, ist nur die konkrete Funktion sichtbar. Da eine JavaScript-Funktion durch Übergabe mehrerer Argumente aufgerufen werden kann, funktioniert sie einfach.
quelle
type
s, Aufzählungen, Generika usw. gehen zur Laufzeit verloren. Das ist auch der Grund, warum du es nicht kannstsomeObject instanceof ISomeInterfaceDefinedInTypeScript
.Wenn Sie in TypeScript überladen, haben Sie nur eine Implementierung mit mehreren Signaturen.
Nur die drei Überladungen werden von TypeScript als mögliche Signaturen für einen Methodenaufruf erkannt, nicht die eigentliche Implementierung.
In Ihrem Fall würde ich persönlich zwei Methoden mit unterschiedlichen Namen verwenden, da die Parameter nicht genügend Gemeinsamkeiten aufweisen. Daher ist es wahrscheinlich, dass der Methodenkörper viele "Wenns" benötigt, um zu entscheiden, was zu tun ist.
TypeScript 1.4
Ab TypeScript 1.4 können Sie normalerweise die Notwendigkeit einer Überladung mithilfe eines Union-Typs beseitigen. Das obige Beispiel kann besser ausgedrückt werden mit:
Der Typ von
a
ist "entwederstring
odernumber
".quelle
class Foo { constructor(obj) { } constructor (a: number, b: string, c: boolean) {} }
Foo.fromObject(obj)
undFoo.fromJson(str)
und so weiter.Foo.methos(1, 2, 3)
Foo.method(1)
Foo.method(Obj)
Mir ist auch aufgefallen, dass Sie in derFoo
Klasse unterschiedliche Methoden haben , fromObject und fromJson?myNum
odermyObj
sowieso eingeben, warum also nicht separate Methoden haben und alles klar machen / unnötige Verzweigungslogik vermeiden.Sie können erklären , eine überladene Funktion , indem er erklärt die Funktion als mit einem Typ, der mehr Aufruf Unterschriften hat:
Dann folgendes:
Die tatsächliche Definition der Funktion muss singulär sein und den entsprechenden internen Versand für ihre Argumente durchführen.
Beispiel: Verwenden einer Klasse (die implementiert werden könnte
IFoo
, aber nicht muss):Interessant ist hier, dass das
any
Formular durch die spezifisch typisierten Überschreibungen ausgeblendet wird.quelle
Was ist Funktionsüberladung im Allgemeinen?
Was ist Funktionsüberladung in JS?
Diese Funktion ist in JS nicht möglich - die zuletzt definierte Funktion wird bei mehreren Deklarationen verwendet:
... und in TS?
Überladungen sind ein Konstrukt zur Kompilierungszeit ohne Auswirkungen auf die JS-Laufzeit:
Ein doppelter Implementierungsfehler wird ausgelöst, wenn Sie den obigen Code verwenden (sicherer als JS). TS wählt die erste passende Überlast in Top-Down-Reihenfolge aus, sodass die Überlastungen von den spezifischsten bis zu den breitesten sortiert werden.
Methodenüberladung in TS: ein komplexeres Beispiel
Überladene Klassenmethodentypen können auf ähnliche Weise wie das Überladen von Funktionen verwendet werden:
Die sehr unterschiedlichen Überladungen sind möglich, da die Funktionsimplementierung mit allen vom Compiler erzwungenen Überlastsignaturen kompatibel ist.
Weitere Infos:
quelle
Als Hinweis auf andere habe ich festgestellt, dass Sie, zumindest wie durch TypeScript, das von WebPack für Angular 2 kompiliert wurde, manifestiert werden, stillschweigend überschrieben werden, anstatt überladene Methoden.
Berufung:
scheint die Methode mit Argumenten auszuführen, wobei die No-Arg-Version stillschweigend ignoriert wird, mit Ausgabe:
quelle
Duplicate function implementation
Warnung für Code wie diesen aus.Funktionsüberladung im Typoskript:
Laut Wikipedia (und vielen Programmierbüchern) lautet die Definition der Überladung von Methoden / Funktionen wie folgt:
In Typoskript können wir keine unterschiedlichen Implementierungen derselben Funktion haben, die entsprechend der Anzahl und Art der Argumente aufgerufen werden. Dies liegt daran, dass beim Kompilieren von TS zu JS die Funktionen in JS die folgenden Eigenschaften aufweisen:
Im engeren Sinne könnte man daher argumentieren, dass es keine Überladung der TS-Funktion gibt. Es gibt jedoch Dinge, die Sie in Ihrem TS-Code tun können, um die Funktionsüberladung perfekt nachzuahmen.
Hier ist ein Beispiel:
In den TS-Dokumenten wird diese Methodenüberladung aufgerufen. Grundsätzlich haben wir dem TS-Compiler mehrere Methodensignaturen (Beschreibungen möglicher Parameter und Typen) bereitgestellt. Jetzt kann TS herausfinden, ob wir unsere Funktion während der Kompilierungszeit korrekt aufgerufen haben, und uns einen Fehler geben, wenn wir die Funktion falsch aufgerufen haben.
quelle