2012-10-04 40 views
4

我目前试图将此代码移植到TypeScript中。将JavaScript requestAnimFrame移植到TypeScript

if (typeof window !== 'undefined') { 
    window.requestAnimFrame = (function(callback){ 
     return window.requestAnimationFrame || 
     window.webkitRequestAnimationFrame || 
     window.mozRequestAnimationFrame || 
     window.oRequestAnimationFrame || 
     window.msRequestAnimationFrame || 
     function(callback){ 
      window.setTimeout(callback, 1000/60, new Date().getTime()); 
     }; 
    })(); 
} 

TSC中的错误,我得到的是:

提供的参数不匹配,通话对象的任何签名

我已经试过声明的interface WindowEx extends Window包含签名,然后铸造(< WindowEx>window).xxx,但我怀疑这是转换这个“典型”代码的正确方法。

尝试:

interface WindowEx extends Window { 
    requestAnimFrame(callback, target?):number; 
    webkitRequestAnimationFrame(callback, target?):number; 
    mozRequestAnimationFrame(callback, target?):number; 
    oRequestAnimationFrame(callback, target?):number; 
    // msRequestAnimationFrame already at WindowAnimationTiming interface 
} 

回答

0

提供的参数不调用对象的匹配签名的原因是因为你调用这样的功能:

(function(callback) { ... })(); 

也就是说,函数接受callback但您没有通过。

您应该删除callback作为参数,因为您没有在任何地方使用它在函数中。

2

下面是我为了让你的代码编译而做的。我只是将requestAnimFrame()定义为全局并键入它,以便TypeScript可以验证对它的调用。目前没有任何扩展内置类型的好方法,例如window,因此需要执行诸如(<any>window).webkitRequestAnimationFrame之类的操作。作为一般规则,如果编译器发出抱怨,并且您知道它是有效的JavaScript,则始终可以投射到<any>以使其工作。

var requestAnimFrame: (callback:() => void) => void = (function(){ 
    return window.requestAnimationFrame || 
    (<any>window).webkitRequestAnimationFrame || 
    (<any>window).mozRequestAnimationFrame || 
    (<any>window).oRequestAnimationFrame || 
    window.msRequestAnimationFrame || 
    function(callback){ 
     window.setTimeout(callback, 1000/60, new Date().getTime()); 
    }; 
})();