दिलचस्प पोस्ट
विशिष्ट उपयोगकर्ता के रूप में PHP से कमांड लाइन एप्लिकेशन चलाना सी ++ में तार आमतौर पर '\ 0' के साथ क्यों समाप्त हो गए हैं? क्या कंसोल में सिस्टम शेल चलाने के लिए एक एक्लिप्स प्लगइन है? 'स्ट्र' और 'फ़्लोट' ऑब्जेक्ट को जोड़ नहीं सकते हैं? जावा 8 लोकलडेट जैक्सन प्रारूप क्रोम पर एक Greasemonkey स्क्रिप्ट से पृष्ठ में जे एस कार्यों को इंजेक्शन JTextField में प्रेस दर्ज करें मैथ्यू में पायथन का उपयोग कर माउस को कैसे नियंत्रित किया जाए? जावा 8 लाम्बा फ़ंक्शंस जो अपवाद फेंकता है? स्विफ्ट मूल बेस क्लास या एनएसओबीजेक्ट स्ट्रिंग विधि में शब्दों की गणना करें? केपीपीएचपी 2.0 – कस्टम त्रुटि पेज कैसे बनाएं? जावास्क्रिप्ट की छिपी हुई विशेषताओं? नेस्टेड एरेज़ पर स्विफ्ट इक्विटी ऑपरेटर Android इम्यूलेटर में लैंडस्केप मोड पर स्विच करना

टाइपस्क्रिप्ट डेकोरेटर कैसे लागू करें?

TypeScript 1.5 अब सज्जाकार हैं

क्या कोई डेकोरेटर को लागू करने और संभावित मान्य डेकोरेटर हस्ताक्षरों में तर्कों का क्या मतलब है इसका सही तरीके से प्रदर्शन करने का एक सरल उदाहरण प्रदान करता है?

declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void; declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void; declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void; declare type ParameterDecorator = (target: Function, propertyKey: string | symbol, parameterIndex: number) => void; 

इसके अतिरिक्त, क्या कोई सर्वोत्तम अभ्यास विचार है जो कि डेकोरेटर को लागू करते समय ध्यान में रखा जाना चाहिए?

वेब के समाधान से एकत्रित समाधान "टाइपस्क्रिप्ट डेकोरेटर कैसे लागू करें?"

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

सामान्य अंक

  • सजावटी को तब कहा जाता है जब वर्ग घोषित किया जाता है-जब कोई ऑब्जेक्ट इंस्टाल्ट नहीं होता है।
  • एकाधिक सज्जाकारों को उसी श्रेणी / संपत्ति / विधि / पैरामीटर पर परिभाषित किया जा सकता है
  • कंस्ट्रक्टरों पर सजावट करने की अनुमति नहीं है

एक वैध डेकोरेटर होना चाहिए:

  1. डेकोरेटर प्रकारों में से एक के लिए ClassDecorator | PropertyDecorator | MethodDecorator | ParameterDecorator ( ClassDecorator | PropertyDecorator | MethodDecorator | ParameterDecorator )
  2. मूल्य (क्लास सज्जाकार और विधि डेकोरेटर के मामले में) लौटें जो सजाए गए मूल्य के लिए असाइन किया गया है।

संदर्भ


विधि / औपचारिक एक्सेसर डेकोरेटर

कार्यान्वयन पैरामीटर:

  • target : कक्षा ( Object ) का प्रोटोटाइप
  • propertyKey : विधि का नाम ( string | symbol )
  • descriptor : ए TypedPropertyDescriptor – यदि आप एक वर्णनकर्ता की कुंजी से अपरिचित हैं, तो मैं इसके बारे में Object.defineProperty (यह तीसरा पैरामीटर) पर इस प्रलेखन में पढ़ने की सिफारिश करेगा।

उदाहरण – बिना तर्क के

उपयोग:

 class MyClass { @log myMethod(arg: string) { return "Message -- " + arg; } } 

कार्यान्वयन:

 function log(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) { const originalMethod = descriptor.value; // save a reference to the original method // NOTE: Do not use arrow syntax here. Use a function expression in // order to use the correct value of `this` in this method (see notes below) descriptor.value = function(...args: any[]) { // pre console.log("The method args are: " + JSON.stringify(args)); // run and store result const result = originalMethod.apply(this, args); // post console.log("The return value is: " + result); // return the result of the original method (or modify it before returning) return result; }; return descriptor; } 

इनपुट:

 new MyClass().myMethod("testing"); 

आउटपुट:

विधि तर्क है: ["परीक्षण"]

वापसी मूल्य है: संदेश – परीक्षण

टिप्पणियाँ:

  • वर्णनकर्ता का मान सेट करते समय तीर सिंटैक्स का उपयोग न करें। यदि आप ऐसा करते हैं तो इसका संदर्भ नहीं होगा।
  • एक नया डिस्क्रिप्टर लौटाकर वर्तमान एक को ओवरराइट करने से मूल डिस्क्रिप्टर को संशोधित करना बेहतर होगा यह आपको कई सज्जाकारों का उपयोग करने की अनुमति देता है, जो कि किसी अन्य डेकोरेटर ने बिना किसी लिपि के लेखक को संपादित किया है। ऐसा करने से आप @enumerable(false) और @log जैसे कुछ का उपयोग करने की अनुमति देता है (उदाहरण: खराब बनाम अच्छा )
  • उपयोगी : TypedPropertyDescriptor का प्रकार तर्क का उपयोग उस विधि को नियंत्रित करने के लिए किया जा सकता है जो विधि हस्ताक्षर ( विधि उदाहरण ) या TypedPropertyDescriptor हस्ताक्षर ( TypedPropertyDescriptor उदाहरण ) को डेकोरेटर पर रखा जा सकता है।

उदाहरण – तर्क के साथ (डेकोरेटर फ़ैक्टरी)

तर्कों का उपयोग करते समय, आपको डेकोरेटर के मानकों के साथ एक फ़ंक्शन घोषित करना होगा, फिर किसी भी तर्क के बिना उदाहरण के हस्ताक्षर के साथ एक फ़ंक्शन लौटें।

 class MyClass { @enumerable(false) get prop() { return true; } } function enumerable(isEnumerable: boolean) { return (target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => { descriptor.enumerable = isEnumerable; return descriptor; }; } 

स्टेटिक मेथड डेकोरेटर

कुछ अंतर के साथ एक विधि डेकोरेटर के समान:

  • इसका target पैरामीटर कन्स्ट्रक्टर फ़ंक्शन है और प्रोटोटाइप नहीं है।
  • डिस्क्रिप्टर को कन्स्ट्रक्टर फ़ंक्शन पर परिभाषित किया गया है और प्रोटोटाइप नहीं है।

क्लास डेकोरेटर

 @isTestable class MyClass {} 

कार्यान्वयन पैरामीटर:

  • target : कक्षा को डेकोरेटर घोषित किया गया है ( TFunction extends Function )।

उदाहरण का उपयोग : कक्षा पर जानकारी संग्रहीत करने के लिए मेटाडेटा एपीआई का उपयोग करना।


संपत्ति डेकोरेटर

 class MyClass { @serialize name: string; } 

कार्यान्वयन पैरामीटर:

  • target : कक्षा ( Object ) का प्रोटोटाइप
  • propertyKey : propertyKey का नाम ( string | symbol )

उदाहरण का उपयोग : एक @serialize("serializedName") डेकोरेटर बनाने और serialize के गुणों की एक सूची के गुणों को जोड़ना


पैरामीटर डेकोरेटर

 class MyClass { myMethod(@myDecorator myParameter: string) {} } 

कार्यान्वयन पैरामीटर:

  • target : कक्षा का प्रोटोटाइप ( Function -अनुप्रयोग लगता है Function अब और काम नहीं करता है.आप यहां any Object या Object का उपयोग किसी भी वर्ग के भीतर डेकोरेटर के उपयोग के लिए करना चाहिए। या उस श्रेणी के प्रकार को निर्दिष्ट करें जिसे आप इसे प्रतिबंधित करना चाहते हैं सेवा मेरे)
  • propertyKey : विधि का नाम ( string | symbol )
  • parameterIndex : फ़ंक्शन के पैरामीटर ( number ) की सूची में पैरामीटर का सूचकांक

सरल उदाहरण

विस्तृत उदाहरण (ओं)

  • डेकोरेटर मेमोरी – विधि, गेट / सेट एस्कॉर डेकोरेटर उदाहरण
 class Foo { @consoleLogger Boo(name:string) { return "Hello, " + name } } 
  • लक्ष्य: उपरोक्त मामले में क्लास का प्रोटोटाइप यह "फू" है
  • propertyKey: उपरोक्त मामले में बुलाया विधि का नाम "बू"
  • विवरणकर्ता: ऑब्जेक्ट का विवरण => वैल्यू प्रॉपर्टी शामिल होती है, जो बदले में फ़ंक्शन ही होता है: फ़ंक्शन (नाम) {रिटर्न 'हैलो' + नाम; }

आप कुछ ऐसा कार्यान्वित कर सकते हैं जो प्रत्येक कॉल को कंसोल में लॉग करता है:

 function consoleLogger(target: Function, key:string, value:any) { return value: (...args: any[]) => { var a = args.map(a => JSON.stringify(a)).join(); var result = value.value.apply(this, args); var r = JSON.stringify(result); console.log('called method' + key + ' with args ' + a + ' returned result ' + r); return result; } } 

एक महत्वपूर्ण बात मैं अन्य जवाबों में नहीं देखता हूं:

डेकोरेटर फैक्टरी

अगर हम एक घोषणा के लिए डेकोरेटर को कैसे लागू किया जाता है, तो हम इसे अनुकूलित करना चाहते हैं, तो हम डेकोरेटर फ़ैक्टरी लिख सकते हैं। डेकोरेटर फ़ैक्टरी केवल एक ऐसा कार्य है जो रनटाइम पर डेकोरेटर द्वारा कहा जाने वाला अभिव्यक्ति देता है।

 // This is a factory, returns one of ClassDecorator, // PropertyDecorator, MethodDecorator, ParameterDecorator function Entity(discriminator: string): { return function(target) { // this is the decorator, in this case ClassDecorator. } } @Entity("cust") export class MyCustomer { ... } 

टाइपस्क्रिप्ट हैंडबुक सजावटी अध्याय जांचें