2013-01-02 6 views
12

Ich denke, das irgendwo, an einem gewissen Punkt angesprochen wurde, nur für das Leben von mir, dass ich nicht so hier meine Frage erinnern kann:Mit dem Gültigkeitsbereich Funktionen in Typoskript

einig javascript Ich mache Arbeit, die wird in eine bestehende Anwendung geladen. Diese Anwendung hat Mist Funktionen zur Verfügung und kaum etwas davon ist mir bekannt außer einige, die ich tatsächlich verwenden möchte. Also sagen wir, dass ich für eine Tatsache weiß, dass window.srslyUsefulFunction für mich verfügbar sein wird und ich nicht viel dafür sorge, dies in eine Typoskript-Definition zu portieren.

Die Frage ist also, wie verwende ich window.srslyUsefulFunction in meiner eigenen Typoskript-Datei, ohne eine Definition dafür zu erstellen?

Beispiel:

class MyClass { 
    public MyMethod (id : string) : void { 
     // do something 
     var result = window.srslyUsefulFunction(id); 
     // do something (with the result) 
    } 
} 
+0

'Fenster' ist ein globales Objekt, Ihr Beispiel sollte funktionieren, wenn die' srslyUsefulFunction' in diesem Bereich deklariert ist. – Cerbrus

+0

das Problem ist nicht wirklich das Fensterobjekt, aber es ist die srslyUsefulFunction, die nicht in meinem Projekt existiert, aber es wird verfügbar sein, wenn dieser Code bereitgestellt wird. Ich füge ziemlich viel Javascript als eine "Komponente" zu einem vorhandenen Black-Box-System hinzu. Ich versuche, diese Black-Box-Methoden in meiner generierten js zu verwenden (natürlich werde ich das nicht lokal ausführen, da das definitiv fehlschlagen wird) – AlexR

Antwort

14

Sie können die Funktion zum Window Schnittstelle hinzufügen und es dann in Ihrem Typoskript Programm verwenden:

interface Window { 
    srslyUsefulFunction(id: number): void; 
} 

class MyClass { 
    doSomething() { 
     window.srslyUsefulFunction(1); 
    } 
} 
+0

Das ist gute Sachen und es scheint ein bisschen sauberer als die Check-Wenn-existiert-Funktion , aber es gibt ehrlich gesagt keine Möglichkeit, das ungeprüfte "reguläre Javascript" in einer ts-Datei zu verwenden? – AlexR

+0

@AlexR: Es sei denn, ich vermisse etwas, das Typoskript ist, diese Antwort überschreibt einfach die Funktion, im Gegensatz zu dem, was ich mache. (Dies ist tatsächlich, wie Sie eine Funktion in JavaScript polyfill) – Cerbrus

+4

Sie können reguläres JavaScript innerhalb einer TypeScript-Datei verwenden, aber nicht, wenn es etwas erweitert bereits in TypeScript definiert, d. h. Fenster ist bereits als eine Implementierung der Window-Schnittstelle deklariert. Wenn Sie die Funktion mit 'window.' benutzen würden - dh wenn Sie sie nur aus dem globalen Gültigkeitsbereich herausziehen, können Sie' declarate srslyUsefulFunction: (id: number): void; 'oder sogar die loose and easy' deklarieren srslyUsefulFunction: any; ' – Fenton

1

Überprüfen Sie, ob die Funktion vorhanden ist. Wenn nicht, deklariere es:

if(!window.hasOwnProperty('srslyUsefulFunction') 
|| typeof window['srslyUsefulFunction'] !== "function"){ 
    window['srslyUsefulFunction'] = function(){ 
     console.log("You're only running a dummy implementation of srslyUsefulFunction here!"); 
    }; 
} 
+0

Dies funktioniert in TypeScript immer noch nicht, da immer noch eine Warnung über 'window.srslyUsefulFunction' angezeigt wird, die nicht definiert ist. Sie müssten die 'Fenster'-Schnittstelle erweitern, um diesen Fehler zu beheben. – Fenton

+0

@SteveFenton, wie wäre es mit dieser Art zu prüfen, ob die Funktion existiert? ('typeof window.srslyUsefulFunction!== "function" 'wird nur geprüft, wenn es existiert) – Cerbrus

+1

Am besten probieren Sie Ihren Code auf dem TypeScript Playground: http://www.typescriptlang.org/Playground/ – Fenton

4

Ich habe eine einfache Problemumgehung.

In index.html

function playIntro() { 
     intro = new lib.intro(); 
     onlinePlayer.contentContainer.addChild(intro); 
     stage.update(); 
    } 

in meinem Main.ts Ich nenne es wie folgt aus:

private onClick(event): void { 

     if (window.hasOwnProperty('playIntro')) { 
      window['playIntro'].call(); 
     } 
    } 

Also ... wenn Sie "blind" js Funktion von globalen Bereich nennen wollen benutze einfach das Fenster ["foo"]. call();

+0

das ist golden. es integriert sich hübsch 'sauber'. es ist ein regelrecht schmutziger hack, um damit zu beginnen, also warum nicht einen weiteren hack zum hack hinzufügen! – JimB

Verwandte Themen