TypeScript Array.prototype.map-Deklaration

9

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

  1. Warum erlaubt TypeScript überladene Signaturen für Umgebungsdeklarationen?
  2. Wie überschreibe ich die Map-Implementierung in einer Klasse, die Array erweitert?

Ich habe das auch auf GitHub angesprochen ... Ссылка

Hinweis

ReadonlyArray<T> hat nur eine einzige Signatur für map, was ...

ist %Vor%     
series0ne 31.01.2017, 13:50
quelle

2 Antworten

2

(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:

%Vor%

Die erste Überlastsignatur kümmert sich um diejenigen, die Sie nicht stören möchten.

    
Nitzan Tomer 31.01.2017, 14:40
quelle
1

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:

  1. Sie ermöglichen es Ihnen, "echte" Interfaces für andere (noch nicht existierende) Klassen zu erstellen. Wenn Sie es implementieren, müssen Sie es vollständig implementieren, da die Schnittstelle die Verfügbarkeit aller verfügbaren Elemente garantiert.
  2. Sie ermöglichen es Ihnen, die Schnittstelle eines bereits vorhandenen Javascript-Typs zu definieren. Dies ist sehr nützlich, wenn Sie eine der vielen, vielen vorhandenen Bibliotheken verwenden und dennoch die Vorteile der statischen Typisierung nutzen möchten. Diese Schnittstellen werden normalerweise in einer .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).

    
Sefe 31.01.2017 14:52
quelle