2015-08-03 25 views
5

निम्नलिखित वर्ग को देखते हुए: जब मैं निम्नलिखित करने की कोशिशinstantiating जेनेरिक प्रकार

class Datum {} 

मैंने एक त्रुटि संदेश (error TS2304: Cannot find name 'T') मिलती है:

class Data<T extends Datum> { 
    datum: T 

    constructor() { 
     this.datum = new T() 
    } 
} 

तो फिर मैं यह कर की कोशिश, लेकिन मैं

class Data<T extends Datum> { 
    datum: T 

    constructor() { 
     this.datum = new Datum(); 
    } 
} 

क्वेस्ट: भी एक त्रुटि संदेश (Type 'Datum' is not assignable to type 'T') मिलता है आयन: क्या बाध्य प्रकार टी को तुरंत चालू करना संभव नहीं है? मेरी धारणा यह थी कि चूंकि टी को बाधित किया गया है कि इसे Datum का विस्तार करना होगा, मैं datum: T = new Datum() कर पाऊंगा।

उत्तर

6

याद रखने के लिए दो चीजें: सबसे पहले, संकलन के दौरान जेनेरिक मिटा दिए जाते हैं। उनके पास कोई रनटाइम प्रभाव नहीं है, इसलिए किसी सामान्य प्रकार को संदर्भित करने का कोई प्रयास जैसे कि यह रनटाइम मान था, इसका कोई मतलब नहीं है।

दूसरा, Datum की व्युत्पन्न कक्षा के लिए यह कन्स्ट्रक्टर पैरामीटर के लिए संभव है। भले ही T मौजूद था, आप शून्य तर्कों के साथ new को अंधेरे से नहीं कर सकते हैं।

कि एक साथ रखें, क्या आप चाहते हैं यह है:

class Datum {} 

class Data<T extends Datum> { 
    datum: T 

    constructor(ctor: new() => T) { 
     this.datum = new ctor(); 
    } 
} 

class ByteDatum extends Datum { 
    new() { } 
} 

let y = new Data(ByteDatum); 
let x = y.datum; // x: ByteDatum 
संबंधित मुद्दे