Javascript 在Typescript中使用范围外函数

Javascript 在Typescript中使用范围外函数,javascript,typescript,Javascript,Typescript,我想这已经在某个地方解决了,在某个时刻,只是为了我的生活,我不记得了,所以我的问题是: 我正在做一些javascript工作,这些工作将加载到现有的应用程序中。这个应用程序有大量可用的函数,除了一些我想实际使用的函数外,我几乎不知道任何函数。假设我知道window.srslyusefulful函数对我来说是可用的,我不太喜欢将它移植到typescript定义中 因此,问题是如何在自己的typescript文件中使用window.srslyusefulf函数,而不为其创建定义 例如: class

我想这已经在某个地方解决了,在某个时刻,只是为了我的生活,我不记得了,所以我的问题是:

我正在做一些javascript工作,这些工作将加载到现有的应用程序中。这个应用程序有大量可用的函数,除了一些我想实际使用的函数外,我几乎不知道任何函数。假设我知道window.srslyusefulful函数对我来说是可用的,我不太喜欢将它移植到typescript定义中

因此,问题是如何在自己的typescript文件中使用window.srslyusefulf函数,而不为其创建定义

例如:

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

您可以将该函数添加到
窗口
界面,然后在您的TypeScript程序中使用它:

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

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

检查该函数是否存在。如果没有,请声明:

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

我有简单的解决办法

在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();
        }
    }

所以。。。如果您想从全局范围调用“blind”js函数,只需使用window[“foo”].call()

window
是一个全局对象,如果在该范围内声明了
srslyusefulffunction
,那么您的示例实际上应该可以工作。问题不是真正的window对象,而是我的项目中不存在的srslyusefulffunction,但部署此代码时它将可用。我基本上是将一些javascript作为“组件”添加到现有的黑盒系统中。我试图在我生成的js中使用黑盒方法(当然我不会在本地运行,因为这肯定会失败),这是一个好东西,看起来比check if exists函数更干净,但是老实说,没有办法在ts文件中使用未经检查的“常规javascript”?@AlexR:除非我缺少typescript,否则这个答案只是覆盖函数,而不是我正在做的。(这实际上是在JavaScript中多填充函数的方式)您可以在TypeScript文件中使用常规JavaScript,但如果它扩展了TypeScript中已定义的内容,即window已声明为window接口的实现,则不能使用常规JavaScript。如果您正在使用带有
窗口的函数。
-即,仅从全局范围中提取它,则可以使用
declare srslyusefulffunction:(id:number):void
甚至是松散易用的
声明srslyusefulffunction:any我选择这一个作为我的答案,因为这可能是最接近我最终实际做的事情(原型化沸腾了相同的事情),这对TS初学者非常有用。这在TypeScript中仍然不起作用,因为您仍然会收到关于未定义
window.srslyusefulffunction
的警告。您必须扩展
窗口
界面才能清除此错误。@SteveFenton,那么这种检查函数是否存在的方法如何?(
typeof window.srslyusefulffunction!==“function”
只有在它存在的情况下才会被检查)你最好的办法是在TypeScript操场上尝试你的代码:@SteveFenton:似乎TypeScript不知道如何验证这样的案例。呃,我想它必须是类似数组的访问,即使它做的完全相同,它也会验证。(也就是说:
window.hasOwnProperty('x')| | typeof window.x!=“function”
)我检查了两个解决方案并做了一些修改,Steve提到的界面解决方案并不像我想的那样是一个真正合适的解决方案,它仍然会产生错误,这一点都不优雅。虽然这对我来说是可行的,因为我处理的是一个不到200 loc的js文件。我将使用上面的代码,实际上我将选择如下内容:window.prototype.srslyusefulffunction=newobject();这在有用代码之外的单独文件中。很不幸,你不能插入未检查的线条。这是金色的。它集成得相当“干净”。这是一个完全肮脏的黑客,所以为什么不添加另一个黑客黑客!