मैंने डेकोरेटर्स के साथ खेलना शुरू किया और किसी भी दस्तावेज के आने से पहले इसका फायदा उठाने का फैसला किया। अगर आपको कोई गलती दिखती है तो कृपया इसे संपादित करने के लिए स्वतंत्र महसूस करें।
सामान्य अंक
- डेकोरेटर्स को तब बुलाया जाता है जब क्लास को घोषित किया जाता है-न कि जब किसी ऑब्जेक्ट को तत्काल किया जाता है।
- एकाधिक सज्जाकार एक ही कक्षा / संपत्ति / विधि / पैरामीटर पर परिभाषित किए जा सकते हैं।
- कंस्ट्रक्टरों पर डेकोरेटर की अनुमति नहीं है।
एक वैध डेकोरेटर होना चाहिए:
- डेकोरेटर प्रकारों में से एक के लिए निर्दिष्ट (
ClassDecorator | PropertyDecorator | MethodDecorator | ParameterDecorator
)।
- एक मान लौटें (वर्ग सज्जाकार और विधि डेकोरेटर के मामले में) जो सजाए गए मूल्य के लिए जिम्मेदार है।
संदर्भ
विधि / औपचारिक एक्सेसरी डेकोरेटर
कार्यान्वयन पैरामीटर:
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");
आउटपुट:
विधि args हैं: ["परीक्षण"]
वापसी मूल्य है: संदेश - परीक्षण
टिप्पणियाँ:
- डिस्क्रिप्टर का मान सेट करते समय तीर सिंटैक्स का उपयोग न करें। यदि आप करते हैं तो संदर्भ का
this
उदाहरण नहीं होगा।
- नए डिस्क्रिप्टर को वापस करके वर्तमान विवरण को ओवरराइट करने की तुलना में मूल विवरणक को संशोधित करना बेहतर है। यह आपको कई डेकोरेटर का उपयोग करने की अनुमति देता है जो एक अन्य डेकोरेटर द्वारा किए गए ओवरराइटिंग के बिना डिस्क्रिप्टर को संपादित करता है। ऐसा करने से आप उसी समय
@enumerable(false)
और जैसे कुछ का उपयोग कर @log
सकते हैं (उदाहरण: खराब बनाम अच्छा )
- उपयोगी : किस प्रकार के
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
: संपत्ति का नाम ( string
| symbol
)।
उदाहरण का उपयोग करें : एक @serialize("serializedName")
सज्जाकार बनाना और संपत्ति के नाम को क्रमबद्ध करने के लिए गुणों की सूची में जोड़ना।
पैरामीटर डेकोरेटर
class MyClass {
myMethod(@myDecorator myParameter: string) {}
}
कार्यान्वयन पैरामीटर:
target
: कक्षा का प्रोटोटाइप ( Function
ऐसा लगता Function
है कि अब काम नहीं करता है। आपको किसी भी वर्ग के भीतर सजावट का उपयोग करने के लिए उपयोग करना चाहिए any
या Object
अब यहां करना चाहिए । या उस वर्ग प्रकार को निर्दिष्ट करें जिसे आप इसे प्रतिबंधित करना चाहते हैं)
propertyKey
: विधि का नाम ( string
! symbol
)।
parameterIndex
: फ़ंक्शन के मापदंडों की सूची में पैरामीटर का सूचकांक ( number
)।
सरल उदाहरण है
विस्तृत उदाहरण
@Injectable
एक डेकोरेटर में इंजेक्ट करना चाहते हैं , तो संदर्भ दें