2016-12-11 33 views
5

की टाइपस्क्रिप्ट एक्सेस स्थिर विशेषता एक स्थिर विशेषता Model एक स्थिर विशेषता और अन्य सामान्य वर्ग Controller<T extends Model> के साथ एक सार वर्ग Model है। मैं नियंत्रक के उदाहरण में मॉडल की स्थिर विशेषता का उपयोग करना चाहता हूं। यही कारण है कि इस तरह करना चाहिए:जेनेरिक प्रकार

abstract class Model{ 
    static hasStatus: boolean = false; 
} 

class MyModel extends Model{ 
    static hasStatus = true; 
} 

class Controller<T extends Model>{ 
    constructor(){ 
     if(T.hasStatus)... 
    } 
} 

लेकिन टीएस कहते 'T' only refers to a type, but is being used as a value here.

वहाँ एक आसान तरीका इस लक्ष्य को हासिल करने के लिए है? या मुझे Model की प्रत्येक विरासत के लिए Controller उप-वर्ग करना चाहिए और मूल्य पुनर्प्राप्त करने के लिए एक विधि लागू करना चाहिए?

+0

'नियंत्रक' बनाते समय 'टी' कैसे बाध्य हो जाता है? –

उत्तर

3

टाइपस्क्रिप्ट में ऐसा करने का कोई तरीका नहीं है। सामान्य प्रकार पैरामीटर केवल तभी दिखाई दे सकते हैं जहां घोषणाओं में प्रकार दिखाई दे सकते हैं, वे रनटाइम पर पहुंच योग्य नहीं हैं। इसका कारण सरल है - जेनेरिक वर्ग की प्रत्येक विधि के लिए एकल जावास्क्रिप्ट फ़ंक्शन जेनरेट किया गया है, और उस फ़ंक्शन के बारे में जानने का कोई तरीका नहीं है कि वास्तविक प्रकार पैरामीटर के रूप में कौन सा वास्तविक प्रकार पारित किया गया था।

class Controller<T extends Model>{ 
    constructor(cls: typeof Model){ 
     if (cls.hasStatus) { 
     } 
    } 
} 

let c = new Controller<MyModel>(MyModel); 

यह इस प्रकार से जब जावास्क्रिप्ट को संकलित बिंदु को वर्णन लग रहा है:

आप रनटाइम पर कि जानकारी की जरूरत है, तो आप निर्माता के लिए एक पैरामीटर जोड़ सकते हैं और एक प्रकार अपने आप को पारित करने के लिए जब यह बुला है - वहां जेनेरिक पैरामीटर के कुछ भी नहीं बचा है, और यदि आप cls पैरामीटर को हटाते हैं तो hasStatus कहां से आना चाहिए इस बारे में कोई जानकारी नहीं है।

var Controller = (function() { 
    function Controller(cls) { 
     if (cls.hasStatus) { 
     } 
    } 
    return Controller; 
}()); 
var c = new Controller(MyModel); 
संबंधित मुद्दे