Erweiterung instance/static Funktionen auf vorhandene Prototypen mit Typoskript
Ich habe vor kurzem eine Frage gestellt über Typoskript Fähigkeit erweitern bestehende Prototypen in der JavaScript-API (hier: Die Ausweitung Objekt.Prototyp mit Typoskript).
War ein Fehler, die hat sich inzwischen geklärt, da der TypeScript 0.9.0 Alpha (die jetzt enthält Generika...TOLL :-))
Im Typoskript, die Schnittstellen sind offen, so dass, wenn Sie sich in lib.d....ts, finden Sie eine Schnittstelle, die definiert, den Vertrag für JavaScript-Objekt-API. Sie sollten auch sehen, eine Deklaration für das Objekt, das definiert Objekt die static-Funktionen.
Der Einfachheit halber, hier sind Sie:
//Pulled from lib.d.ts
interface Object {
toString(): string;
toLocaleString(): string;
valueOf(): Object;
hasOwnProperty(v: string): bool;
isPrototypeOf(v: Object): bool;
propertyIsEnumerable(v: string): bool;
[s: string]: any;
}
declare var Object: {
new (value?: any): Object;
(): any;
(value: any): any;
prototype: Object;
getPrototypeOf(o: any): any;
getOwnPropertyDescriptor(o: any, p: string): PropertyDescriptor;
getOwnPropertyNames(o: any): string[];
create(o: any, properties?: PropertyDescriptorMap): any;
defineProperty(o: any, p: string, attributes: PropertyDescriptor): any;
defineProperties(o: any, properties: PropertyDescriptorMap): any;
seal(o: any): any;
freeze(o: any): any;
preventExtensions(o: any): any;
isSealed(o: any): bool;
isFrozen(o: any): bool;
isExtensible(o: any): bool;
keys(o: any): string[];
}
So, meine Vorherige Frage wurde über die Erweiterung der Schnittstelle für das Objekt, etwa so:
interface Object {
GetFoo(): Foo;
}
Object.prototype.GetFoo = function() {
return new Foo();
}
Wie gesagt, dies funktioniert wie von Typoskript 0.9.0.
Aber jetzt möchte ich auch in der Lage sein, statische Funktionen, um das Objekt, vollkommen legal in reinem JavaScript.
In JavaScript würde ich tun:
Object.FooAgain = function () {
//Yes, it's foo again!
}
Aber ich kann nicht scheinen, um in der Lage sein, dies zu erreichen in Typoskript.
Zuerst habe ich versucht, um zu sehen, wenn das Objekt, in dem die Erklärung war offen (wie bei interfaces):
declare var Object: {
FooAgain(): void;
}
Object.FooAgain = function () {
//TS doesn't like this, and Object.FooAgain isn't available in intellisense.
}
Ich habe auch versucht (ich habe das in einem anderen Artikel, und dachte, es war einen Versuch Wert).
export declare var Object: {
}
aber das scheint alles zu brechen noch mehr...
Zugegebenermaßen das Problem kann auch behoben wurde, in TS 0.9.0 (ich bin bei der Arbeit, damit habe ich nicht wirklich versucht, es zu voll).
Kann jemand etwas Licht in diese Schuppen?
- Wäre es angemessen zu ändern, die richtige Antwort, wie die Antwort hat sich verändert, seit die Frage erstellt wurde?
- Ändern Sie die akzeptierte Antwort auf die eine, die akzeptierte Antwort empfiehlt.
- Ihr Wunsch ist mein Befehl.
- Vielen Dank für die Verbesserung der Qualität von dieser Website 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da TypeScript 1.4 statische Erweiterungen können leicht Hinzugefügt werden. Das TypeScript-team verändert die
lib.d.ts
- Datei mit Schnittstellen für alle statischen Typ-Definitionen.Der statische Typ-Definitionen, die alle den Namen wie
[Type]Constructor
: Also, wenn Sie wollen, fügen Sie eine statische Funktion zu gebenObject
, fügen Sie dann Ihre definition umObjectConstructor
.Definition:
Umsetzung:
Die Probleme, die Sie auftreten, sind die folgenden:
Deklarationen von Variablen sind nicht offen wie Schnittstellen, so können Sie keine Eigenschaften hinzufügen, um eine bestehende
declare var ...
.Weil es
declare var
und nichtdeclare class
können Sie nicht verlängern-Objekt mit der Vererbung.So dass Sie nicht bekommen kann die volle Erfahrung von TypeScript in diesem Szenario. Man kann sich nur der Kompromiss:
Wenn Sie wollen die volle Typoskript Erfahrung empfehle ich erstellen Sie eine Klasse, die statische Methoden - die Sie nicht betreiben, die auf eine Instanz jedenfalls, so dass es wenig Schaden in dies zu tun:
UPDATE
Es ist jetzt möglich, da TS 1.4. Siehe Stefans Antwort unten
LEGACY
Habe ich diesen Fehler ausgelöst für eine Weile jetzt: https://typescript.codeplex.com/workitem/917
One-Lösung, die das Typoskript team haben könnte (ohne Erweiterung der Sprache spec) ist verwendet haben Schnittstellen für die statischen Elemente und Konstruktoren : http://basarat.github.io/TypeScriptDeepDive/#/modellingstatics
Grundsätzlich, wenn lib.d....ts hatte:
Dann könnte man leicht Hinzugefügt Mitglieder zum Objekt über:
Ich gerade erstellt eine feature-Anfrage für diese sowie : https://typescript.codeplex.com/workitem/1085
[Type]Constructor