2015-03-22 16 views
5

में चर का नाम प्राप्त करें मैं टाइपस्क्रिप्ट में चर नाम कैसे प्राप्त कर सकता हूं? मैं कुछ इस तरह हैं:टाइपस्क्रिप्ट

var name = "Foo"; 
alert(getVariableName(name)); //Prints "name" 
+0

मैंने एक लाइब्रेरी बनाई है जो 'nameof' फ़ंक्शन जोड़ती है: [ts-nameof] (https://github.com/dsherret/ts-nameof)। आप इसे केवल टाइपस्क्रिप्ट में उपलब्ध भाषा के कुछ हिस्सों के साथ भी उपयोग कर सकते हैं (उदा। इंटरफेस और टाइप उपनाम)। –

उत्तर

11

बेसार के उत्तर पर विस्तार करने के लिए, आपको एक ऐसा फ़ंक्शन बनाने की आवश्यकता है जो एक पैरामीटर के रूप में लेता है जिसमें आपके चर के उपयोग शामिल होंगे। क्योंकि जावास्क्रिप्ट में आप किसी भी फ़ंक्शन के कोड तक पहुंच सकते हैं, फिर परिवर्तनीय नाम निकालने के लिए रेगेक्स का उपयोग करने का एक साधारण मामला बन जाता है।

var varExtractor = new RegExp("return (.*);"); 
export function getVariableName<TResult>(name:() => TResult) { 
    var m = varExtractor.exec(name + ""); 
    if (m == null) throw new Error("The function does not contain a statement matching 'return variableName;'"); 
    return m[1]; 
} 

var foo = ""; 
console.log(getVariableName(() => foo)); 
+0

यदि मुझे गलत नहीं है, तो ऑब्जेक्ट्स के गुणों के लिए यह कक्षा योग्य नाम वापस कर देगा, उदाहरण के लिए: 'Foo.bar'। केवल संपत्ति का नाम लौटने के लिए, 'm [1] .substring (Math.max (0, m [1] .lastIndexOf ("। ") का उपयोग करके, अंतिम बिंदु के बाद केवल नाम के हिस्से को वापस करने के लिए संभव हो सकता है।) '। 'Math.max' कॉल का उपयोग इस मामले को संभालने के लिए किया जाता है जब 'lastIndexOf'' -1' वापस लौटाएगा, इस मामले में पूरी स्ट्रिंग को वापस किया जाना चाहिए (अनुक्रमणिका '0' से)। –

+0

कुछ minifications हटा नहीं है ";" फ़ंक्शन बॉडी से इसलिए नया RegExp ("वापसी (। *)}" का उपयोग करना सुरक्षित है; और फिर ";" को प्रतिस्थापित करें खाली स्ट्रिंग के साथ और इसे ट्रिम करें। – jabko87

+0

मैंने एक बदलाव जोड़ा है जो पूर्ण पथ को पुनर्प्राप्त करने की अनुमति देता है। https://mrpmorris.blogspot.co.uk/2017/08/typescript-convert-lambda-expression.html –

4

टाइपप्रति कार्यावधि में जावास्क्रिप्ट है। तो वहाँ के रूप में ही सीमाओं लागू होते हैं: Get the 'name' of a variable in Javascript

लेकिन अगर आप की तरह

alert(getVariableName(()=>name)) 

यहाँ सामान कर सकते हैं आप समारोह getVariableName में पारित कर दिया के शरीर को पार्स करने और मिलेगा कि एक स्ट्रिंग के रूप।

2

एक दृष्टिकोण एक वस्तु में इस तरह के मान संग्रहीत करने के लिए है:

var o = { 
    firstName: "Homer", 
    lastName: "Simpson" 
}; 

हम o के नाम नहीं मिल सकता है, लेकिन हम नाम (या "कुंजी") अपने दो संपत्तियों की प्राप्त कर सकते हैं:

var k = Object.keys(o); 
console.log(k[0]); // prints "firstName" 
3

Cernicova-ड्रैगोमीर के जवाब विस्तार करना:

basarat के जवाब में विस्तार करते हुए, आप समारोह है कि एक पैरामीटर के रूप लेता है एक समारोह है कि आपके चर के लिए उपयोग में शामिल होंगे बनाना होगा। क्योंकि जावास्क्रिप्ट में आप किसी भी फ़ंक्शन के कोड तक पहुंच सकते हैं, फिर यह परिवर्तनीय नाम निकालने के लिए रेगेक्स का उपयोग करने का एक साधारण मामला बन जाता है।

भी एक वस्तु का एक क्षेत्र का समर्थन करने के:

var varExtractor = new RegExp("(.*)"); 

export function getVariableName<TResult>(getVar:() => TResult) { 
    var m = varExtractor.exec(getVar + ""); 

    if (m == null) 
     throw new Error("The function does not contain a statement matching 'return variableName;'"); 

    var fullMemberName = m[1]; 
    var memberParts = fullMemberName.split('.'); 

    return memberParts[memberParts.length-1]; 
} 

var foo = { bar: "" }; 
var varName = getVariableName(() => foo.bar); //prints "bar" 

सूचना है कि मैं "वापसी" को हटा चुके हैं, क्योंकि यह जब ES6 को लक्षित Node.js पर काम नहीं करता।