2013-01-02 126 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