Dekoratörler ve Üstveriler
Deneysel dekoratörleri etkinleştirmeyi, sınıf, yöntem ve özellik dekoratörleri yazmayı ve bağımlılık ekleme kalıpları için reflect-metadata kullanmayı öğrenin.
Dekoratörler ve Üstveriler, CoddyKit'te ücretsiz bir Frontend Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Frontend Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Frontend Academy kursu toplamda 4 dersten oluşur.
Dekoratörler Nedir?
Dekoratörler, sınıfları, yöntemleri, özellikleri veya parametreleri tanımlama zamanında değiştiren işlevlerdir. Angular, NestJS, TypeORM ve sınıf tabanlı MobX'te yoğun olarak kullanılırlar.
Dekoratör Sözdizimi
Bir sınıfın, yöntemin, özelliğin veya parametrenin başına @DecoratorName ekleyin. Dekoratör işlevi, sınıf tanımlandığında çalışır.
@Component({ selector: 'app-root' })
export class AppComponent {
@Input() title: string;
@HostListener('click')
onClick() {
console.log('clicked');
}
}Dekoratörleri Etkinleştirme
tsconfig.json içindeki deneysel seçeneği etkinleştirin. Yeni ECMAScript Aşama 3 dekoratörleri (TypeScript 5.0+) bu seçeneğe ihtiyaç duymaz ancak farklı anlamlara sahiptir.
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}Sınıf Dekoratörü
Yapıcıyı bağımsız değişken olarak alır. Sınıfı değiştirebilir, sarmalayabilir veya genişletebilir.
function Singleton<T extends { new (...a: any[]): {} }>(target: T) {
let instance: T;
return class extends target {
constructor(...args: any[]) {
if (!instance) instance = new target(...args) as T;
return instance;
}
};
}
@Singleton
class Logger { /* ... */ }Yöntem Dekoratörü
(hedef, anahtar, tanımlayıcı) değerlerini alır. Yöntemi sarmalayabilir; örneğin çağrıları kaydetmek için kullanılabilir.
function Log(target: any, key: string, descriptor: PropertyDescriptor) {
const original = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`[${key}]`, args);
return original.apply(this, args);
};
}
class Service {
@Log
greet(name: string) { return `Hello ${name}`; }
}Özellik Dekoratörü
(hedef, anahtar) değerlerini alır. Özellik hakkındaki bilgileri kaydetmek için genellikle reflect-metadata ile kullanılır.
function Required(target: any, key: string) {
const existing = Reflect.getMetadata('required', target) || [];
Reflect.defineMetadata('required', [...existing, key], target);
}
class User {
@Required name: string;
@Required email: string;
}Parametre Dekoratörü
(hedef, anahtar, parameterIndex) değerlerini alır. Bağımlılık ekleme için, hangi parametrelerin hangi hizmetlere ihtiyaç duyduğunu kaydetmek amacıyla kullanılır.
function Inject(token: string) {
return function (target: any, key: string, index: number) {
const existing = Reflect.getMetadata('inject', target, key) || {};
existing[index] = token;
Reflect.defineMetadata('inject', existing, target, key);
};
}
class UserService {
constructor(@Inject('Database') db: Database) {}
}reflect-metadata
reflect-metadata, dekoratörlerin sınıflardaki üst verileri okuyup yazmasını sağlayan bir polyfill'dir. Angular DI ve birçok ORM için gereklidir.
npm install reflect-metadata
// main.ts (entry point):
import 'reflect-metadata';
import { Reflect } from 'reflect-metadata';
Reflect.defineMetadata('key', 'value', target);
Reflect.getMetadata('key', target); // 'value'Dekoratör Fabrikaları
Bir fabrika, bağımsız değişken geçirmek için kullanılan bir dekoratör döndürür.
function Component(config: { selector: string }) {
return function (target: any) {
target.selector = config.selector;
};
}
@Component({ selector: 'app-root' })
class AppComponent {}Doğrulama Kullanım Örneği
Küçük bir doğrulama kitaplığı oluşturmak için özellik dekoratörlerini bir doğrulama işleviyle birleştirin.
// Decorator records that a field is required:
function Required(target: any, key: string) {
const fields = Reflect.getMetadata('required', target) || [];
Reflect.defineMetadata('required', [...fields, key], target);
}
class User {
@Required name!: string;
@Required email!: string;
}
function validate(obj: any): string[] {
const required: string[] = Reflect.getMetadata('required', obj) || [];
return required.filter(k => obj[k] == null);
}Aşama 3 Dekoratörleri (TC39)
Standartlaştırılmış dekoratörlerin (TS 5.0+, Node 22+ sürümlerinde bir seçenek arkasında desteklenir) imzası farklıdır. Deneysel seçeneğe ve reflect-metadata'ya ihtiyaç duymazlar.
Dekoratörler Ne Zaman Kullanılmalı?
Çerçevenin sunduğu yerlerde dekoratörleri kullanın (Angular, NestJS, TypeORM). Düz ön uç kodunda kendi dekoratörlerinizi oluşturmayın; karmaşıklık ekler ve sizi belirli bir çalışma zamanı davranışına bağlarlar.
Hızlı Kontrol
Eski (deneysel) dekoratörleri üst veri yansıtmayla kullanmak için hangi tsconfig seçeneklerini etkinleştirmeniz gerekir?
Özet: Dekoratörler
Dekoratörler, sınıfları/yöntemleri/özellikleri/parametreleri tanımlama zamanında değiştirir. experimentalDecorators + emitDecoratorMetadata seçeneklerini etkinleştirin. Sınıf, yöntem, özellik ve parametre dekoratörlerinin imzaları farklıdır. reflect-metadata üst verileri depolar; fabrikalar bağımsız değişken geçirir. Angular, NestJS ve TypeORM tarafından yoğun olarak kullanılırlar. Aşama 3 dekoratörleri (TS 5+) gelecektir ve seçenek gerektirmez.
Sıkça Sorulan Sorular
“Dekoratörler ve Üstveriler” dersi ücretsiz mi?
Evet — “Dekoratörler ve Üstveriler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Frontend Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Frontend Academy kursu toplamda 4 dersten oluşur.
“Dekoratörler ve Üstveriler” dersinde ne öğreneceğim?
Deneysel dekoratörleri etkinleştirmeyi, sınıf, yöntem ve özellik dekoratörleri yazmayı ve bağımlılık ekleme kalıpları için reflect-metadata kullanmayı öğrenin. Frontend Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Frontend Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Frontend Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Dekoratörler ve Üstveriler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Frontend Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Frontend Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Şablon Dize Türleri
- Dekoratörler ve Üstveriler
- React ile TypeScript: FC Genel Türleri ve Kancalar
- Katı Mod ve any Kullanımını Kaldırma