TypeScript'te Dekoratörler
Bu makale, TypeScript'teki dekoratörleri açıklar.
YouTube Video
TypeScript'te Dekoratörler
TypeScript dekoratörleri, sınıflara, metodlara, erişimcilere, özelliklere veya parametrelere ek işlevsellik veya davranış eklemek için bir mekanizmadır. Dekoratörler, kod okunabilirliğini ve tekrar kullanılabilirliğini artırmak için güçlü bir araçtır.
Dekoratörlerin Temelleri
Bir dekoratör, bir sınıfa veya sınıf üyelerine ek işlevsellik ekleyen bir fonksiyondur. Dekoratörler TypeScript 1.5'te tanıtıldı ve ECMAScript standardı için de önerildi.
1{
2 "compilerOptions": {
3 "experimentalDecorators": true
4 }
5}
- Dekoratörleri kullanmak için,
tsconfig.json
dosyasındakiexperimentalDecorators
seçeneğini etkinleştirmeniz gerekir.
Dekoratör Türleri
TypeScript'te aşağıdaki beş dekoratörü kullanabilirsiniz.
- Sınıf Dekoratörü Bir sınıfa uygulanan bir dekoratör.
- Metot Dekoratörü Bir sınıfın metoduna uygulanan bir dekoratör.
- Erişimci Dekoratörü Bir sınıf özelliğinin getter veya setter'ına uygulanan bir dekoratör.
- Özellik Dekoratörü Bir sınıfın özelliğine uygulanan bir dekoratör.
- Parametre Dekoratörü Bir metodun parametresine uygulanan bir dekoratör.
Sınıf Dekoratörü
Sınıf dekoratörleri, sınıflara uygulanan dekoratörlerdir. Sınıf dekoratörleri, sınıf tanımının hemen üzerine yazılır ve sınıf yapıcısına erişebilir. Genellikle sınıf davranışını değiştirmek veya meta veriler eklemek için kullanılırlar.
1function Logger(constructor: Function) {
2 console.log(`Class ${constructor.name} is being constructed`);
3}
4
5@Logger
6class Person {
7 constructor(public name: string) {}
8}
9
10const person = new Person('John');
11// Output: Class Person is being constructed
Bu örnekte, Logger
dekoratörü sınıfa uygulanır ve sınıf başlatıldığında konsola bir mesaj gösterilir.
Metot Dekoratörü
Metot dekoratörleri sınıf metotlarına uygulanır ve metot çağrılarını ve davranışını değiştirebilir. Bir metot dekoratörü üç argüman alır.
- Sınıfın prototipi
- Metodun adı
- Metodun özellik tanımlayıcısı
1function LogExecutionTime(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
2 const originalMethod = descriptor.value;
3
4 descriptor.value = function (...args: any[]) {
5 console.time(propertyKey);
6 const result = originalMethod.apply(this, args);
7 console.timeEnd(propertyKey);
8 return result;
9 };
10}
11
12class MathOperations {
13 @LogExecutionTime
14 add(a: number, b: number): number {
15 return a + b;
16 }
17}
18
19const math = new MathOperations();
20math.add(2, 3);
21// Output: add: 0.000ms (execution time is displayed)
Bu örnekte, LogExecutionTime
dekoratörü metoda uygulanır ve metodun çalışma süresi kaydedilir.
Erişimci Dekoratörü
Erişimci dekoratörler, sınıf özelliklerinin getter
veya setter
larına uygulanır. Özellik değerleri değiştirilirken davranış eklemek için kullanışlıdırlar.
1function LogAccess(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
2 const originalGet = descriptor.get;
3 const originalSet = descriptor.set;
4
5 if (originalGet) {
6 descriptor.get = function () {
7 console.log(`Getter called for ${propertyKey}`);
8 return originalGet.call(this);
9 };
10 }
11
12 if (originalSet) {
13 descriptor.set = function (value: any) {
14 console.log(`Setter called for ${propertyKey} with value: ${value}`);
15 originalSet.call(this, value);
16 };
17 }
18}
19
20class Car {
21 private _speed: number = 0;
22
23 @LogAccess
24 get speed() {
25 return this._speed;
26 }
27
28 set speed(value: number) {
29 this._speed = value;
30 }
31}
32
33const car = new Car();
34car.speed = 120; // Setter called for speed with value: 120
35console.log(car.speed); // Getter called for speed → 120
Bu örnekte, getter
ve setter
çağrıldığında çıktı kaydetmek için bir erişimci (accessor) dekoratörü kullanılır.
Özellik Dekoratörü
Özellik dekoratörleri, sınıf özelliklerine uygulanır ancak özelliğin değerini veya davranışını doğrudan değiştiremez. Özelliklerin meta verilerini elde etmek için kullanılırlar.
1function Readonly(target: any, propertyKey: string) {
2 Object.defineProperty(target, propertyKey, {
3 writable: false
4 });
5}
6
7class Book {
8 @Readonly
9 title: string = "TypeScript Guide";
10}
11
12const book = new Book();
13book.title = "New Title"; // Error: Cannot assign to read only property 'title'
Bu örnekte, title
özelliğine Readonly
dekoratörü uygulanmıştır ve bu özellik salt okunur hale getirilmiştir.
Parametre Dekoratörü
Parametre dekoratörleri bir metodun parametrelerine uygulanır. Genellikle meta verileri saklamak veya parametreleri doğrulamak için kullanılırlar. Dekoratörler üç argüman alır.
- Sınıfın prototipi
- Metodun adı
- Parametre İndeksi
1function LogParameter(target: any, propertyKey: string, parameterIndex: number) {
2 console.log(`Parameter at index ${parameterIndex} in method ${propertyKey} was decorated.`);
3}
4
5class User {
6 greet(@LogParameter message: string) {
7 console.log(message);
8 }
9}
10
11const user = new User();
12user.greet('Hello!');
13// Output: Parameter at index 0 in method greet was decorated.
Bu örnekte, LogParameter
dekoratörü greet
metodunun ilk parametresine uygulanmıştır ve metod çağrıldığında, parametrenin dekoratörlü olduğu kaydedilir.
Dekoratörlerin Pratik Örnekleri
Dekoratörler, özellikle bağımlılık enjeksiyonu ve meta veri tanımı için Angular gibi frameworklerde yaygın olarak kullanılır. Örneğin, aşağıdaki gibi Angular bileşenlerini tanımlamak için @Component
dekoratörünü kullanabilirsiniz.
1@Component({
2 selector: 'app-root',
3 template: '<h1>Hello World</h1>',
4})
5export class AppComponent {}
Bu nedenle dekoratörler genellikle framework ve kütüphanelerin temel parçaları olarak kullanılır ve kodu öz ve net tutmaya yardımcı olur.
Dekoratörlerin Özeti
TypeScript dekoratörleri, sınıflara, metodlara ve özelliklere esnek bir şekilde işlevsellik ekleyen güçlü araçlardır. Özel dekoratörler kullanmak, kodun sürdürülebilirliğini ve yeniden kullanılabilirliğini artırır ve daha fazla soyutlamaya olanak tanır. Dekoratörler, Angular ve NestJS gibi frameworklerde önemli bir rol oynar ve onları anlamak, bu frameworklerin nasıl çalıştığını derinlemesine anlamaya yardımcı olur.
Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.