2012-10-08 26 views
14

मैं सोच रहा हूं कि फ़ंक्शन को मान के रूप में पास करने के लिए मैं एक प्रकार के कन्स्ट्रक्टर का संदर्भ कैसे प्राप्त कर सकता हूं। असल में, मैं एक सामान्य प्रकार की रजिस्ट्री रखना चाहता हूं जो सामान्य प्रकार के रजिस्ट्री उदाहरण के सदस्य फ़ंक्शन को कॉल करके उदाहरणों को बनाने की अनुमति देगा।कन्स्ट्रक्टर फ़ंक्शन का संदर्भ

उदाहरण के लिए:

class GeometryTypeInfo 
{   
    constructor (public typeId: number, public typeName: string, public fnCtor: (...args: any[]) => IGeometry) { 
    } 
    createInstance(...args: any[]) : IGeometry { return this.fnCtor(args); } 
    } 
} 

बाद में:

class Point implements IGeometry { 
    constructor(public x: number, public y: number) { } 

    public static type_info = new GeometryTypeInfo(1, 'POINT', Point); // <- fails 
    // also fails: 
    // new GeometryTypeInfo(1, 'POINT', new Point); 
    // new GeometryTypeInfo(1, 'POINT', Point.prototype); 
    // new GeometryTypeInfo(1, 'POINT', Point.bind(this)); 
} 

किसी को भी पता है कि अगर यह एक कक्षाएं निर्माता समारोह संदर्भ के लिए संभव है?

उत्तर

18

आप कन्स्ट्रक्टर के प्रकार का वर्णन करने के लिए निर्माण हस्ताक्षर के साथ कन्स्ट्रक्टर प्रकार शाब्दिक या ऑब्जेक्ट प्रकार का शाब्दिक उपयोग कर सकते हैं (आमतौर पर, भाषा स्पेक के अनुभाग 3.5 देखें)। अपने उदाहरण का उपयोग करने के लिए, निम्नलिखित काम करना चाहिए:

interface IGeometry { 
    x: number; 
    y: number; 
} 

class GeometryTypeInfo 
{   
    constructor (public typeId: number, public typeName: string, public fnCtor: new (...args: any[]) => IGeometry) { 
    } 
    createInstance(...args: any[]) : IGeometry { return new this.fnCtor(args); } 
} 

class Point implements IGeometry { 
    constructor(public x: number, public y: number) { } 

    public static type_info = new GeometryTypeInfo(1, 'POINT', Point); 
} 

सूचना निर्माता प्रकार GenometryTypeInfo के निर्माता पैरामीटर सूची में शाब्दिक, और CreateInstance के कार्यान्वयन में नया कॉल।

+0

धन्यवाद, मुझे कल्पना में 'नया' शाब्दिक याद आया। –

+1

'// <- विफलता 'में मुझे लगता है कि यह समाधान है, यह अब विफल नहीं होता है, अगर यह सही है तो आप इसे // // <में संपादित कर सकते हैं - अब और असफल नहीं होता है? अन्यथा यह थोड़ा भ्रामक है, thx – peter

6

typeof YourClass आपको निर्माता प्रकार देता है जिसका उपयोग एनोटेशन में किया जा सकता है।

YourClass और this.constructor स्वयं रचनाकार है। तो, यह कोड संकलित:

class A {} 

const B : typeof A = A; 

this.constructor स्थितियों में, टाइपप्रति (जो हास्यास्पद है) द्वारा निर्माता प्रकार के मूल्य के रूप में मान्यता प्राप्त नहीं है तो तरह है कि आप इसे कास्टिंग कोई any

new (<any> this.constructor)() कुछ धोखाधड़ी उपयोग करने की आवश्यकता

यही है।

+0

इस समाधान के साथ समस्या यह है कि ओपी "इंटरफ़ेस लागू करने वाले प्रकार के निर्माता" प्रकार का संदर्भ देना चाहता है, और मेरा मानना ​​है कि आप 'टाइपो IGeometry' नहीं कह सकते हैं' IGeometry' एक इंटरफ़ेस है । ऐसे मामले में जहां पारित परम किसी दिए गए वर्ग या सुपर क्लास के लिए एक कन्स्ट्रक्टर है, यह एक शानदार तरीका है। – jkjustjoshing

+1

'इंटरफ़ेस MyCtor {new(): MyInterface} को तब नौकरी करना चाहिए। – gaperton

+2

लेकिन जब भी संभव हो मैं 'टाइपोफ क्लास 'पसंद करता हूं। यह अधिक विशिष्ट है और विरासत श्रृंखला को ठीक से संभालता है। – gaperton

संबंधित मुद्दे