TypeScript
क्लास डेकोरेटर
खोज…
पैरामीटर
पैरामीटर | विवरण |
---|---|
लक्ष्य | वर्ग को सजाया जा रहा है |
बेसिक क्लास डेकोरेटर
एक क्लास डेकोरेटर सिर्फ एक ऐसा फंक्शन है जो क्लास को उसके एकमात्र तर्क के रूप में लेता है और उसके साथ कुछ करने के बाद उसे लौटा देता है:
function log<T>(target: T) {
// Do something with target
console.log(target);
// Return target
return target;
}
हम तब क्लास डेकोरेटर को क्लास में लगा सकते हैं:
@log
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
वर्ग सज्जाकार का उपयोग करके मेटाडेटा उत्पन्न करना
इस बार हम एक क्लास डेकोरेटर घोषित करने जा रहे हैं जो हमारे द्वारा लागू किए जाने पर क्लास में कुछ मेटाडेटा जोड़ देगा:
function addMetadata(target: any) {
// Add some metadata
target.__customMetadata = {
someKey: "someValue"
};
// Return target
return target;
}
हम तब वर्ग सज्जाकार को लागू कर सकते हैं:
@addMetadata
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
function getMetadataFromClass(target: any) {
return target.__customMetadata;
}
console.log(getMetadataFromClass(Person));
डेकोरेटर तब लागू किया जाता है जब वर्ग घोषित नहीं किया जाता है जब हम कक्षा के उदाहरण बनाते हैं। इसका मतलब यह है कि मेटाडेटा को एक वर्ग के सभी उदाहरणों में साझा किया जाता है:
function getMetadataFromInstance(target: any) {
return target.constructor.__customMetadata;
}
let person1 = new Person("John");
let person2 = new Person("Lisa");
console.log(getMetadataFromInstance(person1));
console.log(getMetadataFromInstance(person2));
क्लास डेकोरेटर को तर्क वितर्क करना
हम अनुकूलन की अनुमति देने के लिए किसी अन्य फ़ंक्शन के साथ क्लास डेकोरेटर को लपेट सकते हैं:
function addMetadata(metadata: any) {
return function log(target: any) {
// Add metadata
target.__customMetadata = metadata;
// Return target
return target;
}
}
addMetadata
कॉन्फ़िगरेशन के रूप में उपयोग किए जाने वाले कुछ तर्कों को लेता है और फिर एक अनाम फ़ंक्शन देता है जो वास्तविक डेकोरेटर है। डेकोरेटर में हम तर्कों को एक्सेस कर सकते हैं क्योंकि जगह में एक बंद है।
हम तब कुछ विन्यास मूल्यों को पारित करने वाले डेकोरेटर का आह्वान कर सकते हैं:
@addMetadata({ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" })
class Person {
private _name: string;
public constructor(name: string) {
this._name = name;
}
public greet() {
return this._name;
}
}
हम उत्पन्न मेटाडेटा तक पहुँचने के लिए निम्नलिखित फ़ंक्शन का उपयोग कर सकते हैं:
function getMetadataFromClass(target: any) {
return target.__customMetadata;
}
console.log(getMetadataFromInstance(Person));
यदि सब कुछ सही चला तो कंसोल को प्रदर्शित होना चाहिए:
{ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" }