2013-01-02 151 views
12

我覺得這個已經解決的地方,在某些時候,只是我不記得所以在這裏我的生活範圍的功能使用了是我的問題:在打字稿

我做一些JavaScript的工作,將被加載到現有的應用程序中。這個應用程序有可用的函數,除了我想實際使用的一些功能外,幾乎沒有任何功能可以使用。因此,讓我們說我知道window.srslyUsefulFunction將會提供給我,並且我並不在乎將它移植到打印機定義中。

所以,問題是我怎麼使用window.srslyUsefulFunction在我自己的打字稿文件沒有爲它創造一個定義?

例子:

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

'window'是一個全局對象,如果在該範圍內聲明'srslyUsefulFunction',那麼你的示例應該可以工作。 – Cerbrus

+0

這個問題並不是真正的窗口對象,但它是我的項目中不存在的srslyUsefulFunction,但是在部署此代碼時它將可用。我幾乎將javascript作爲一個「組件」添加到現有的黑盒系統中。我試圖在我生成的js中使用黑盒子方法(當然,我不會在本地運行,因爲這肯定會失敗) – AlexR

回答

14

您可以將功能添加到Window接口,然後在您的打字稿程序中使用它:

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

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

這是好東西,它看起來比check-if-exists功能更清潔,但是在ts文件中真的沒有辦法使用未經檢查的「常規javascript」? – AlexR

+0

@AlexR:除非我錯過了一些打字稿,否則這個答案只是覆蓋功能,而不是我正在做的事情。 (這實際上是如何在JavaScript中填充函數的) – Cerbrus

+4

您可以在TypeScript文件中使用常規JavaScript,但是如果它擴展了TypeScript中已定義的某些內容,即不是Window已經被聲明爲Window接口的實現。如果你正在使用'window.'函數 - 也就是從全局範圍中取出它,你可以使用'declare srslyUsefulFunction:(id:number):void;'或者鬆散且容易的'declare srslyUsefulFunction:any;' – Fenton

1

檢查是否函數存在。如果沒有,請聲明:

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

這仍然無法在TypeScript中使用,因爲您仍然會收到關於未定義'window.srslyUsefulFunction'的警告。你將不得不擴展'Window'接口來清除這個錯誤。 – Fenton

+0

@SteveFenton,這種檢查函數是否存在的方式呢? ('typeof window.srslyUsefulFunction!==「函數」只會被檢查,如果它存在) – Cerbrus

+1

你最好的選擇是在TypeScript Playground上試試你的代碼:http://www.typescriptlang.org/Playground/ – Fenton

4

我有一個簡單的解決方法。

index.html中

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

我把它叫做這樣的:

private onClick(event): void { 

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

所以...如果你想打電話,從全球範圍內 「盲」 js函數,只需使用window [「foo」]。call();

+0

這是黃金。它整合相當「乾淨」。這是一個徹頭徹尾的骯髒的黑客入侵,所以爲什麼不加入黑客攻擊! – JimB