2015-11-11 12 views
6

मेरे पास कुछ टाइपस्क्रिप्ट कोड है, और मैं कुछ मेटाप्रोग्रामिंग कर रहा हूं जहां मुझे instance.func.name तक पहुंचने में सक्षम होना चाहिए, हालांकि टाइपस्क्रिप्ट संकलित जेएस में फ़ंक्शन नाम को छोड़ देता है।टाइपस्क्रिप्ट फ़ंक्शन नाम प्रदान नहीं कर रहा है

टाइपप्रति:

class ClassName { 
    // ... 
    func(): ReturnType { 
     // ... 
    } 
} 

संकलित जावास्क्रिप्ट:

// ... 
ClassName.prototype.func = function() { 
    // ... 
}; 

वांछित जावास्क्रिप्ट:

ClassName.prototype.func = function func() { 
    // ...       ^^^^ 
}; 

वहाँ एक संकलक विकल्प मैं याद कर रहा हूँ, या एक कीवर्ड मैं में उपयोग कर सकते हैं है इसे पूरा करने के लिए टाइपस्क्रिप्ट?

function named(target: any, key: string) { 
    target[key].functionName = key; 
} 

class ClassName { 
    // ... 
    @named 
    func(): ReturnType { 
     // ... 
    } 
} 

फिर instance.func.functionName का उपयोग:

उत्तर

5

एक समाधान, एक बार जो मैं, स्वीकार किए जाते हैं के रूप में चिह्नित नहीं किया जाएगा, क्योंकि यह name संपत्ति प्रदान नहीं करता है, लेकिन किसी भी अन्य पहचानकर्ता के साथ काम करता है इस प्रकार है ।

+0

बहुत चालाक समाधान – robsonrosa

6

टाइपस्क्रिप्ट सजावट का उपयोग करना संभव नहीं है क्योंकि function.namereadonly property है।

एक hacky way है:

class ClassName { 
    // ... 
    public func = function test() { 

    } 

    public func2() { 

    } 
} 

let instance = new ClassName(); 

console.log("RESULT", instance.func['name']); 

लेकिन यह वास्तव में आप के लिए क्या पूछना (अर्थात समारोह घोषणा में लापता प्रोटोटाइप नोटिस) नहीं है।

function shouldEmitFunctionName(node: FunctionLikeDeclaration) { 
    if (node.kind === SyntaxKind.FunctionExpression) { 
     // Emit name if one is present 
     return !!node.name; 
    } 
    if (node.kind === SyntaxKind.FunctionDeclaration) { 
     // Emit name if one is present, or emit generated name in down-level case (for export default case) 
     return !!node.name || languageVersion < ScriptTarget.ES6; 
    } 
} 

आप अपने हाथों गंदा प्राप्त करना चाहते हैं, तो आप ./node_modules/typescript/lib/typescript.js फ़ाइल को अपडेट कर सकते हैं:

संपादित करें: emitter.ts में SyntaxKind.MethodDeclaration के लिए कोई हैंडलिंग क्योंकि वहाँ टाइपप्रति संकलक समारोह नाम लिखने नहीं है। अभी पिछले शर्त जोड़:

function shouldEmitFunctionName(node) { 
    if (node.kind === 173 /* FunctionExpression */) { 
     // Emit name if one is present 
     return !!node.name; 
    } 
    if (node.kind === 213 /* FunctionDeclaration */) { 
     // Emit name if one is present, or emit generated name in down-level case (for export default case) 
     return !!node.name || languageVersion < 2 /* ES6 */; 
    } 

    // MODIFIED 
    if (node.kind === 143 /* MethodDeclaration */) {      
     return true; 
    }               
} 

और परिवर्तन का परीक्षण करने के लिए इस चलाएँ:

$ node ./node_modules/typescript/lib/typescript.js hello.ts 
+0

हाँ, पास नहीं बल्कि काफी (आद्य लापता)। पता नहीं था कि टाइपस्क्रिप्ट समर्थित है हालांकि ES2016 गुणों की तरह दिखता है। हैंडी। – azz

+0

मैंने कुछ और खुदाई की। कृपया अद्यतन देखें। –

+0

अच्छा लगता है, एक upvote है। हालांकि मुझे इस परियोजना के लिए टाइपस्क्रिप्ट को स्टॉक करने की आवश्यकता है। :( – azz

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