Bauen Sie eine Funktion ein Objekt mit Eigenschaften, die in TypeScript
Möchte ich eine Funktion erstellen-Objekt, das hat auch einige Eigenschaften gehalten. Zum Beispiel in JavaScript, die ich tun würde:
var f = function() { }
f.someValue = 3;
Nun in Maschinenschrift, kann ich beschreiben, die Art dieser:
var f: { (): any; someValue: number; };
Allerdings kann ich nicht wirklich bauen kann, ohne dass einem Guss. Wie:
var f: { (): any; someValue: number; } =
<{ (): any; someValue: number; }>(
function() { }
);
f.someValue = 3;
Wie würden Sie bauen, ohne dass ein cast?
InformationsquelleAutor der Frage JL235 | 2012-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn also die Anforderung ist einfach zu erstellen und weisen Sie diese Funktion auf "f" ohne eine Besetzung, hier ist eine mögliche Lösung:
Im wesentlichen, es verwendet eine selbst ausgeführte Funktion literal zu "bauen", ein Objekt zu entsprechen, wird die Signatur, bevor die Zuweisung erfolgt. Die einzige Seltsamkeit ist, dass die innere Deklaration der Funktion muss vom Typ 'any', sonst der compiler schreit, dass Sie die Zuweisung an eine Eigenschaft, die nicht vorhanden ist auf dem Objekt noch.
EDIT: Vereinfacht den code ein wenig.
InformationsquelleAutor der Antwort nxn
Update: Diese Antwort war die beste Lösung, die in früheren Versionen von Typoskript, aber es gibt bessere Optionen in neueren Versionen (siehe andere Antworten).
Die akzeptierte Antwort, die funktioniert und könnte erforderlich sein, in einigen Situationen, haben aber den Nachteil, sofern keine Typ-Sicherheit für den Aufbau des Objekts. Diese Technik wird zumindest werfen Sie einen Typ-Fehler, wenn Sie versuchen, hinzufügen eine Undefinierte Eigenschaft.
InformationsquelleAutor der Antwort Greg Weber
Typoskript ausgelegt ist diesem Fall durch Erklärung Zusammenführen:
Erklärung verschmelzen lässt uns sagen, dass etwas eine Funktion und einen Namensraum (internes Modul):
Dies spart Tipparbeit und ermöglicht es uns, Ihnen schreiben
f()
undf.someValue
. Beim schreiben einer.d.ts
Datei vorhandenen JavaScript-code, verwenden Siedeclare
:Hinzufügen von Eigenschaften zu den Funktionen wird oft eine verwirrende oder unerwartete Muster in Typoskript, so versuchen Sie es zu vermeiden, aber es kann notwendig sein, wenn die Verwendung oder Umwandlung von älteren JS-code. Dies ist einer der erst mal wäre es sinnvoll zu mischen internen Modulen (Namensräume) mit externen.
InformationsquelleAutor der Antwort mk.
Dies ist leicht erreichbar, jetzt (Typoskript 2.x) mit
Object.assign(target, source)
Beispiel:
Die Magie hier ist, dass
Object.assign<T, U>(...)
eingegeben wird, um wieder eine Kreuzung Art vonT & U
.Erzwingen, dass dies wird zu einer Schnittstelle bekannt ist auch straight-forward:
Nachteil: Sie müssen möglicherweise polyfill Objekt.zuweisen wenn welche auf älteren Browsern.
InformationsquelleAutor der Antwort Meirion Hughes
Als eine Verknüpfung, können Sie dynamisch zuweisen, das Objekt Wert mit Hilfe der ['Eigenschaft'] - accessor:
Dadurch wird die Typ-Prüfung. Jedoch ist es ziemlich sicher, weil Sie absichtlich den Zugriff auf die Eigenschaft auf die gleiche Weise:
Jedoch, wenn Sie wirklich wollen, geben Sie für die Eigenschaft Wert, das funktioniert nicht.
InformationsquelleAutor der Antwort Rick Love
Eine aktualisierte Antwort: da die Zugabe der Schnittpunkt Typen über
&
ist es möglich, zu "verschmelzen" zwei abgeleitete Typen on the fly.Hier ist ein allgemeiner Helfer, der liest die Eigenschaften eines Objektes
from
und kopiert Sie über ein Objektonto
. Es gibt das gleiche Objekt zurückonto
aber mit einer neuen Art gehören beide Gruppen von Eigenschaften, so richtig beschreiben das Laufzeitverhalten:Diese low-level-Helfer wird immer noch führen Sie eine Typ-Aussage, aber ist es Typ-sicher. Mit diesem Helfer haben wir einen operator, den wir verwenden können, um zu lösen die OP das problem der volle Typ-Sicherheit:
Klicken Sie hier, um zu versuchen, es in der TypeScript Playground. Beachten Sie, dass wir eingeschränkt haben
foo
TypFoo
so das Ergebnis dermerge
muss eine vollständigeFoo
. Wenn Sie also umbenennenbar
zubad
dann bekommt man einen Typ-Fehler.NB Es ist immer noch eine Art Loch hier, jedoch. Typoskript nicht bieten eine Möglichkeit zum einschränken von einem parameter " Typ " auf "keine Funktion". So könnten Sie verwirrt werden und an Ihre Funktion als zweites argument
merge
und das würde nicht funktionieren. So lange, bis dieser erklärt werden kann, haben wir, um es zu fangen Laufzeit:InformationsquelleAutor der Antwort Daniel Earwicker
Ich kann nicht sagen, dass es sehr einfach ist, aber es ist definitiv möglich:
wenn du neugierig dies ist eine Kernaussage von mir mit TypeScript/JavaScript-version von
Optional
InformationsquelleAutor der Antwort thiagoh
Dieser fährt vom starken eingeben, aber Sie können tun,
wenn Sie versuchen zu umgehen, bedrückend starke Typisierung wie ich war, als ich fand diese Frage. Leider ist dies ein Fall, Typoskript, schlägt fehl, absolut gültigen JavaScript, so dass Sie haben, um Sie sagen, Typoskript, wieder aus.
"Du JavaScript ist durchaus gültig Typoskript" zu false ausgewertet wird. (Hinweis: mit 0.95)
InformationsquelleAutor der Antwort WillSeitz