2013-02-05 30 views
7

मैं गूगलमैं कैसे टाइपप्रति

से webgl-utils.js के लिए एक d.ts फ़ाइल बना रहा हूं मैं पिछले लाइनों जहां एक वैश्विक वस्तु में एक विधि है में से एक के साथ एक समस्या है में एक 'बंदर समझौता' प्रोटोटाइप घोषणा करेंगे 'बंदर समझौता' (मुझे लगता है कि यह सही शब्दावली है)

समस्या लाइन में लिखा है:

/** 
    * Provides requestAnimationFrame in a cross browser way. 
    */ 
window.requestAnimFrame = (function() { 
    return window.requestAnimationFrame || 
      window.webkitRequestAnimationFrame || 
      window.mozRequestAnimationFrame || 
      window.oRequestAnimationFrame || 
      window.msRequestAnimationFrame || 
      function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) { 
      window.setTimeout(callback, 1000/60); 
      }; 
})(); 

मैं अपने टाइपप्रति फ़ाइल में इस घोषणा करेंगे तो मैं त्रुटियों संकलन नहीं किया जाएगा, जब मैं का उपयोग करें कार्य:

function tick() 
{ 
     requestAnimFrame(tick); 
     drawScene(); 
} 

मैं अब की कोशिश की है:

interface window 
{ 
     requestAnimFrame(): any; 
} 

लेकिन इस त्रुटि को दूर नहीं करता:

The name 'requestAnimFrame' does not exist in the current scope 
+0

क्या आपने इसे 'विंडो' के साथ स्पष्ट रूप से उपसर्ग करने का प्रयास किया है? – Bergi

+0

हां, यह समान त्रुटि – Toad

+0

भी देता है, VisStudio में इंटेलिजेंस विधि नहीं दिखाता है। यह सामान्य दिखाता है: requestAnimationFrame() लेकिन नया – Toad

उत्तर

7

आप सही दिशा में बढ़ रहा है कर रहे थे, लेकिन आप के बदलावों को भी परिभाषित करने की आवश्यकता आपके पास:

interface Window { 
    requestAnimFrame(callback: any, element?: any): void; 
    webkitRequestAnimationFrame(callback: any, element?: any): void; 
    mozRequestAnimationFrame(callback: any, element?: any): void; 
    oRequestAnimationFrame(callback: any, element?: any): void; 
} 

window.requestAnimFrame = (function() { 
    return window.requestAnimationFrame || 
     window.webkitRequestAnimationFrame || 
     window.mozRequestAnimationFrame || 
     window.oRequestAnimationFrame || 
     window.msRequestAnimationFrame || 
     function(callback, element?) { 
      window.setTimeout(callback, 1000/60); 
     }; 
})(); 

function tick() { 
    window.requestAnimFrame(tick); 
} 
+1

भयानक नहीं है। पूरी तरह से काम करता है। – Toad

+1

क्या यह 'lib.d.ts' में 'विंडो' इंटरफ़ेस का विस्तार करता है, या इसे मुखौटा करता है? मेरा अनुभव बताता है कि यह दृष्टिकोण 'window.setInterval' जैसे अन्य कार्यों को छुपाता है। –

+1

इंटरस्पेस टाइपस्क्रिप्ट में खुले हैं, इसलिए जब तक आप मूल के रूप में एक ही सामान्य रूट (उसी स्तर पर तार्किक रूप से) में दूसरी 'इंटरफ़ेस विंडो' जोड़ते हैं, तो यह मौजूदा इंटरफ़ेस में जोड़ देगा। वैश्विक इंटरफेस के साथ, यह सुनिश्चित करना वास्तव में आसान है कि यह एक ही सामान्य रूट है :) – Fenton

3

यकीन है कि इंटरफेस नाम पूंजी के साथ शुरू होता है "डब्ल्यू" "डब्ल्यू" नहीं

बनाने
interface Window { 
    requestAnimFrame():any; 
} 

कॉलिंग कोड में window.requestAnimFrame(); का उपयोग करें। उम्मीद यह आपकी समस्या का समाधान होगा

1

एक और तरीका:

declare var wnd: { 
    requestAnimationFrame: any; 
    webkitRequestAnimationFrame: any; 
    mozRequestAnimationFrame: any; 
    oRequestAnimationFrame: any; 
    msRequestAnimationFrame: any; 
} 
var wnd = window; 

export var requestAnimFrame = (function() { 
    return wnd.requestAnimationFrame || 
      wnd.webkitRequestAnimationFrame || 
      wnd.mozRequestAnimationFrame || 
      wnd.oRequestAnimationFrame || 
      wnd.msRequestAnimationFrame || 
      function (/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) { 
       window.setTimeout(callback, 1000/60); 
      }; 
})(); 
0

एक ही रास्ता जो मेरे लिए काम करता है:

declare global { 
    interface Window { 
     requestAnimFrame(callback:() => void): any; 
     webkitRequestAnimationFrame(callback:() => void): any; 
     mozRequestAnimationFrame(callback:() => void): any; 
     oRequestAnimationFrame(callback:() => void): any; 
    } 
} 

Window.prototype.requestAnimFrame = function() { 
    return window.requestAnimationFrame || 
     window.webkitRequestAnimationFrame || 
     window.mozRequestAnimationFrame || 
     window.oRequestAnimationFrame || 
     function (callback) { 
      window.setTimeout(callback, 1000/60); 
     }; 
}