Hvordan lage tilpassede TypeScript-dekoratorer
Dekoratorer er en funksjon i TypeScript som gjør det mulig å endre klasser, metoder, egenskaper eller parametere under kjøring. De er spesielle funksjoner som gir metaprogrammeringsmuligheter. I TypeScript brukes dekoratører ofte i rammeverk som Angular for å forbedre funksjonaliteten. Denne artikkelen forklarer hvordan du lager skreddersydde dekoratører trinn for trinn.
Typer dekoratører i TypeScript
Det er fire hovedtyper dekoratører i TypeScript:
- Klasse dekoratører
- Metode Dekoratører
- Tilbehør dekoratører
- Eiendomsdekoratører
Aktivering av dekoratører i TypeScript
For å bruke dekoratører i et TypeScript-prosjekt, må experimentalDecorators-alternativet være aktivert i tsconfig.json-filen.
{
"compilerOptions": {
"experimentalDecorators": true
}
}Opprette en klassedekoratør
Klassedekoratorer brukes på konstruktøren av en klasse. De er nyttige for å legge til metadata eller funksjonalitet til klassen. Her er et eksempel på hvordan du lager en enkel klassedekoratør.
function logClass(constructor: Function) {
console.log(`Class ${constructor.name} is created`);
}
@logClass
class Person {
constructor(public name: string) {}
}
const person = new Person("John");
// Output: Class Person is createdOpprette en metodedekoratør
Metodedekoratorer brukes på klassemetoder. De kan brukes til å modifisere eller observere oppførselen til metoden. Nedenfor er et eksempel på en metodedekorator som logger metodeutførelsen.
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Method ${propertyKey} is called with arguments:`, args);
return originalMethod.apply(this, args);
};
return descriptor;
}
class Calculator {
@logMethod
add(a: number, b: number) {
return a + b;
}
}
const calc = new Calculator();
calc.add(2, 3);
// Output: Method add is called with arguments: [2, 3]Opprette en eiendomsdekoratør
Eiendomsdekoratører kan brukes til å observere eller endre egenskaper. Her er et eksempel der en eiendomsdekoratør sørger for at en eiendom har en standardverdi.
function defaultValue(value: any) {
return function (target: any, propertyKey: string) {
let propertyValue = value;
const getter = function () {
return propertyValue;
};
const setter = function (newValue: any) {
propertyValue = newValue || value;
};
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter,
enumerable: true,
configurable: true,
});
};
}
class User {
@defaultValue('Anonymous')
name!: string;
}
const user = new User();
console.log(user.name); // Output: Anonymous
user.name = 'Alice';
console.log(user.name); // Output: AliceOpprette en parameterdekorator
Parameterdekoratorer brukes på en metodes parametere. De kan være nyttige for oppgaver som validering eller logging av argumenter. Her er et eksempel på en parameterdekorator.
function logParameter(target: any, propertyKey: string, parameterIndex: number) {
console.log(`Parameter at index ${parameterIndex} in method ${propertyKey} is being decorated`);
}
class Vehicle {
drive(@logParameter speed: number) {
console.log(`Driving at speed ${speed}`);
}
}
const vehicle = new Vehicle();
vehicle.drive(50);
// Output: Parameter at index 0 in method drive is being decoratedKonklusjon
Dekoratorer i TypeScript tilbyr kraftige metaprogrammeringsfunksjoner som kan forbedre og utvide funksjonaliteten til klasser, metoder og egenskaper. Ved å bruke tilpassede dekoratører er det mulig å lage gjenbrukbare, effektive og organiserte kodestrukturer. Denne guiden demonstrerte opprettelsen av forskjellige typer dekoratører: klasse, metode, eiendom og parameter.