2013-09-16 7 views
9

मैं टाइपस्क्रिप्ट में अपने कुछ जावास्क्रिप्ट कोड को फिर से लिखने की कोशिश कर रहा हूं। इस कोड में से कुछ में स्ट्रिंग ऑब्जेक्ट प्रोटोटाइप में जोड़े गए एक्सटेंशन के संदर्भ हैं।टाइपस्क्रिप्ट में मूल प्रकार बढ़ाएं, त्रुटि: "_this परिभाषित नहीं है ..."

String.prototype.format = function() { 
    var formatted = this; 
    for (var i = 0; i < arguments.length; i++) { 
     formatted = formatted.replace(
      RegExp("\\{" + i + "\\}", 'g'), arguments[i].toString()); 
    } 
    return formatted; 
}; 

हालांकि टाइप स्क्रिप्ट के साथ इसे जोड़ना काफी चुनौतीपूर्ण रहा है।

मैंने उदाहरण देखा है जहां आप मूल इंटरफ़ेस का विस्तार घोषित करते हैं और फिर इंटरफ़ेस से मेल खाने के लिए प्रोटोटाइप को फ़ंक्शन असाइन करते हैं और अपनी कार्यक्षमता प्रदान करते हैं। इसलिए जैसा ...

interface String { 
    showString:() => string; 
} 

String.prototype.showString =(): string { 
    return this; 
}; 

इस त्रुटियों क्योंकि सिवाय "केवल इस परिभाषित नहीं है ..."

अन्य बातों मैं कोशिश की है

स्ट्रिंग विस्तार करने के लिए एक नया वर्ग बनाने के लिए है ...
export class MoreString extends string { 

} 

हालांकि यह भी काम नहीं करता है क्योंकि आप केवल कक्षाएं बढ़ा सकते हैं और स्ट्रिंग/स्ट्रिंग कक्षाएं नहीं हैं बल्कि प्रकारों में निर्मित हैं।

स्ट्रिंग का विस्तार करने और मेरी विस्तार विधि तक पहुंचने का सबसे आसान तरीका क्या है?

उत्तर

11

मैं उस दिन बनाया मुझे देख यहाँ क्या हो रहा था बाद में एक और मुद्दा में चल समाप्त हो गया। शीर्ष से, यहां यह है ...

टाइपस्क्रिप्ट जावास्क्रिप्ट के शीर्ष पर बनाया गया है, इसलिए @Nypan का कहना है कि जावास्क्रिप्ट वैध टाइपस्क्रिप्ट है। इस वजह से मतभेदों को नजरअंदाज करना बहुत आसान है।

इस तरह का एक जावास्क्रिप्ट फ़ंक्शन इस संदर्भ को संदर्भित करता है कि फ़ंक्शन "इस" के साथ निष्पादित करता है।

var f = function (postFix) {return this + postFix}; 

टाइपप्रति वाक्य रचना को जोड़ने के लिए आप प्रकार

var f = function (postFix: string): string {return this + postFix}; 

इन मामलों यह सिर्फ क्लासिक जावास्क्रिप्ट की तरह समारोह के दायरे को संदर्भित करता है के दोनों में परिभाषित करेगा। हालांकि, चीजों को बदलना है जब हम ऐसा करते हैं ...

var f = (postFix: string): string {return this + postFix}; 
//or more correctly 
var f = (postFix: string): string => {return this + postFix}; 

जब आप मापदंडों के सामने से समारोह को दूर तो यह अब एक क्लासिक कार्य है। यह "फैट एरो" फ़ंक्शन बन जाता है, स्पष्ट रूप से "=>" वाक्यविन्यास का उपयोग करके बाहर भी। उपरोक्त उदाहरणों में "यह" अब कक्षा को संदर्भित करता है कि फ़ंक्शन सी # की तरह मौजूद है।

स्ट्रिंग के प्रोटोटाइप को फ़ंक्शन असाइन करने के अपने प्रयास में मैंने फ़ंक्शन कीवर्ड छोड़ा, इसलिए इसे "फैट एरो" फ़ंक्शन के रूप में व्याख्या किया गया और कक्षा के दायरे में इसे बांधने का प्रयास किया गया। हालांकि कार्य वर्ग खुराक एक वर्ग में मौजूद नहीं है और त्रुटि "_this परिभाषित नहीं है" का कारण बनता है।

जब मैं "फ़ंक्शन" कीवर्ड जोड़ता हूं, तो फ़ंक्शन का अर्थ है जैसा कि मैंने इरादा किया है और सही तरीके से काम करता है।

interface String { 
    format:() => string; 
} 

String.prototype.format = function() : string { 
    var formatted = this; 
    for (var i = 0; i < arguments.length; i++) { 
     formatted = formatted.replace(
      RegExp("\\{" + i + "\\}", 'g'), arguments[i].toString()); 
    } 
    return formatted; 
}; 
2

बिल्कुल समान मामले में मुझे लगता है कि जैसे कि यह कार्य करें:

interface String { 
    endsWith(str); 
    startsWith(str); 

} 

यह सिर्फ संकलक को पूरा करने के लिए है। आप जावास्क्रिप्ट में बिल्कुल तरीकों को लागू करते हैं।

उम्मीद है कि मदद करता है।

2

मुझे लगता है कि यह वही बात है जो आगे बढ़ रही थी लेकिन आप इसे जावास्क्रिप्ट में बढ़ाते हैं (जावास्क्रिप्ट वैध टाइपस्क्रिप्ट है) और फिर नई कार्यक्षमता को इंटरफ़ेस करें।

लघु उदाहरण:

String.prototype.myExtension = function() { 
    return this + " something." 
}; 

interface String { 
    myExtension :() => string; 
} 

alert("test".myExtension()); 
+1

लेकिन में जहां कोड आप इस परिभाषा को जोड़ते हैं? क्योंकि मुझे एक संपत्ति 'myExtension' मिलता है, 'स्ट्रिंग' प्रकार पर मौजूद नहीं है, इसलिए यह संकलन नहीं कर रहा है। मेरे पास मॉड्यूल परिभाषा के अंदर कोड का यह टुकड़ा है। – Oscar

+0

यह मेरे लिए काम करता है, टैंक! – Benoit

+0

@ ऑस्कर वही, मेरा –

1

आप इस तरह स्ट्रिंग इंटरफ़ेस का विस्तार करने की जरूरत है:

interface String { 
    stringFormat(...args: string[]): string; 
} 

और आप इस

module Utilities { 
    String.prototype.stringFormat = function(): string { 
     var args = arguments; 
     return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) { 
      if (m == "{{") { return "{"; } 
      if (m == "}}") { return "}"; } 
      return args[n]; 
     }); 
    } 
} 

कार्यान्वयन स्रोत की तरह लागू करने की आवश्यकता: Equivalent of String.format in jQuery

+0

पर काम नहीं करता है 'मॉड्यूल यूटिलिटीज' का महत्व ... धन्यवाद! – mlorber

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