Spezifikation
Laut der MDN-Spezifikation für Array.prototype.map () Karte sollte so benutzt werden ...
%Vor%Problem
TypeScript hat mehrere überladene Deklarationen für map, was es sehr schwierig macht, extend Array<T>
.
Ich würde erwarten, das zu sehen (was in lib.d.ts ist) ...
%Vor%Aber lib.d.ts hat auch diese ...
%Vor%Einspruch
Da JavaScript das Überladen von Methoden nicht erlaubt und auch TypeScript für die Klassenimplementierung nicht, sollte TypScript dies auch für Ambient-Deklarationen nicht zulassen.
Fragen
Ich habe das auch auf GitHub angesprochen ... Ссылка
Hinweis
ReadonlyArray<T>
hat nur eine einzige Signatur für map, was ...
(1) Wenn es nicht erlaubt wäre, Signaturen in Umgebungsdeklarationen zu überladen, wie würden Sie die verschiedenen Signaturen in den nativen js Funktionen / Methoden erhalten?
Es gibt viele Überladungen in lib.d.ts
, die die Funktionsweise der nativen js-Objekte widerspiegeln.
(2) Sie müssen dem Compiler mitteilen, dass Sie alle möglichen deklarierten Signaturen abdecken.
In Ihrem Fall können Sie etwas tun wie:
Die erste Überlastsignatur kümmert sich um diejenigen, die Sie nicht stören möchten.
Ihre Frage berührt verschiedene Aspekte von TypeScript. Ich werde sie einzeln behandeln und dann alle zusammensetzen.
Array & lt; T & gt;
Schnittstellen dienen in TypeScript zwei Zwecken:
.d.ts
-Datei definiert (und lib.d.ts
-Datei enthält die grundlegenden JavaScript-Typen). Diese Schnittstellen sind auf den vorhandenen Typ zugeschnitten und normalerweise nicht für Sie gedacht. Sie können, wenn Sie wollen, aber Sie müssen alle seine Mitglieder implementieren. Die Array<T>
Schnittstelle ist von der zweiten Art und daher nicht für Sie gedacht.
this
Parameter in Funktionen
Der Parameter this:
in der Funktionsdefinition ist kein echter Parameter in dem Sinne, dass Sie Argumente übergeben können. Sie können angeben, welcher Typ den Wert this
im Funktionskörper erwartet. Wenn Sie es nicht angeben, wird this
vom Typ any
sein, was oft nicht sehr nützlich ist.
Funktion / Methode überladen
In TypeScript werden Funktionen und Methoden nicht in dem Sinne überlastet, dass sie in Sprachen wie Java oder C # überladen sind. Sie können es nicht öfter als einmal implementieren, Sie können jedoch alternative Signaturen definieren, um die statische Typisierung für Funktionen zuzulassen, die Variantentypen zurückgeben oder Variantenparameter verwenden. Insbesondere in .d.ts
-Definitionsdateien ist dies nützlich und oft notwendig, da vorhandene Bibliotheken die schwache Typisierung von JavaScript verwenden, um Werte zurückzugeben oder Parameter verschiedener Typen zu erwarten. Das macht deinen Einwand falsch. Sie müssen die Funktion überladen, um diese JavaScript-Konstrukte unterzubringen.
Tupel
In einem JavaScript-Array können Sie in jedem der Slots Werte verschiedener Typen zuweisen. In einer TypeScript-Array-Definition geben Sie den Typ one an, den der Compiler erzwingt. Um die Lücke zu füllen, können Sie Tupel definieren. Ein Typ wie [number, string, string]
wird in ein JavaScript-Array any[]
konvertiert, und TypeScript kann weiterhin die statische Typisierung erzwingen.
Zusammenfassung
Die Array-Methode überlädt Ihr Objekt gegenüber in Array<T>
führt einen statisch typisierten this
-Parameter ein, falls das Array ein tatsächliches [T, T]
, [T, T, T]
, [T, T, T, T]
, [T, T, T, T, T]
ist. Es impliziert nicht, dass das Array mehrere map
-Methoden bereitstellt. Es ist die gleiche Methode, aber für einige spezifische Array-Typen überladen. Es wird in lib.d.ts
bereitgestellt und wurde daher nicht für die Implementierung durch Sie entwickelt. Sie können die zugrunde liegende Klasse erweitern (die bereits ohne die Schnittstelle vorhanden ist), aber die Überladungen verletzen Sie nicht (zumindest in diesem Fall nicht, da sie nur this
-Parameter bereitstellen).
Tags und Links javascript typescript method-overloading method-overriding