Zrozumienie dekoratorów TypeScript
Dekoratory TypeScript zapewniają potężny sposób dodawania funkcjonalności do klas, metod, właściwości i parametrów w czasie wykonywania. Są często używane w frameworkach, takich jak Angular, do wstrzykiwania zależności, rejestrowania, walidacji i innych. Ten artykuł wyjaśni różne typy dekoratorów w TypeScript i jak ich skutecznie używać.
Czym są dekoratory TypeScript?
Dekoratory w TypeScript to funkcje, które są poprzedzone symbolem @
i mogą być dołączone do różnych elementów, takich jak klasy, metody lub właściwości. Umożliwiają one modyfikowanie zachowania kodu, do którego są dołączone, bez bezpośredniej zmiany kodu.
Rodzaje dekoratorów
- Dekoratory klasy: Stosowane do całej klasy.
- Dekoratory metod: Stosowane do metody w klasie.
- Dekoratory właściwości: Stosowane do właściwości w klasie.
- Dekoratory parametrów: Stosowane do parametrów metody w klasie.
Jak włączyć dekoratory w TypeScript
Zanim zaczniesz używać dekoratorów, upewnij się, że są one włączone w pliku tsconfig.json
, ustawiając parametr "experimentalDecorators"
na true
.
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
Dekoratorzy klas
Dekorator klasy jest stosowany do całej klasy. Jest przydatny do dodawania metadanych lub modyfikowania zachowania klasy.
function Controller(route: string) {
return function (target: Function) {
target.prototype.route = route;
};
}
@Controller('/api/user')
class UserController {
// Class logic
}
console.log(new UserController().route); // Outputs: '/api/user'
Dekoratory metod
Dekoratory metod są stosowane do metod w obrębie klasy. Dekoratory te mogą być używane do modyfikowania lub rejestrowania zachowania metody.
function Log(target: any, propertyName: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling ${propertyName} with arguments: ${args}`);
return originalMethod.apply(this, args);
};
}
class Calculator {
@Log
add(a: number, b: number) {
return a + b;
}
}
const calculator = new Calculator();
calculator.add(2, 3); // Logs: 'Calling add with arguments: 2,3'
Dekoratorzy nieruchomości
Dekoratory właściwości służą do dodawania funkcjonalności do właściwości w klasie. Mogą być przydatne do walidacji lub dodawania metadanych do właściwości.
function ReadOnly(target: any, key: string) {
const descriptor: PropertyDescriptor = {
writable: false
};
return descriptor;
}
class Person {
@ReadOnly
name: string = 'John Doe';
}
const person = new Person();
person.name = 'Jane Doe'; // Error: Cannot assign to read only property 'name'
Dekoratory parametrów
Dekoratory parametrów służą do modyfikowania lub rejestrowania informacji o parametrach metody.
function LogParameter(target: any, propertyName: string, index: number) {
const metadataKey = `log_${propertyName}_parameters`;
if (Array.isArray(target[metadataKey])) {
target[metadataKey].push(index);
} else {
target[metadataKey] = [index];
}
}
class Demo {
method(@LogParameter param1: string, @LogParameter param2: number) {
// Method logic
}
}
Wniosek
Dekoratory w TypeScript zapewniają potężny sposób na zwiększenie funkcjonalności kodu bez modyfikowania jego struktury. Rozumiejąc, jak używać dekoratorów klas, metod, właściwości i parametrów, możesz wdrożyć zaawansowane funkcje, takie jak rejestrowanie, walidacja i wstrzykiwanie zależności. Dekoratory są kluczową funkcją w TypeScript, która może znacznie usprawnić przepływ pracy programistycznej, szczególnie w dużych aplikacjach.