2012-10-04 74 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()); 
    }; 
})();