Decorator metadata
- TypeScript kursu
- Uzman
- Ders 21/35
- 4 dk
emitDecoratorMetadata ile tür metaverisini öğrenirsin.
emitDecoratorMetadata nedir?
emitDecoratorMetadata: true, dekoratörlerin uygulandığı öğelerin tür bilgilerini çalışma zamanına taşır. Her dekoratör çağrısına, hedef öğenin türünü içeren bir metadata parametresi eklenir. Bu, bağımlılık enjeksiyonu kütüphanelerinin (ör. NestJS, TypeDI) çalışması için gereklidir.
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}experimentalDecorators de açık olmalıdır.
Metadata formatı
emitDecoratorMetadata açıkken TypeScript, dekoratör çağrısına üç metadata anahtarı ekler: design:type (özellik türü), design:paramtypes (parametre türleri) ve design:returntype (dönüş türü). Bu bilgiler Reflect.metadata aracılığıyla saklanır.
// derleme sonrası:
// __decorate([
// Reflect.metadata("design:type", Function),
// Reflect.metadata("design:paramtypes", [String])
// ], ...)Bu nedenle reflect-metadata polyfill'i gerekir.
Uygulama Metadata anahtarlarını üret
Bir buildMetadataKeys fonksiyonu yaz: hasType, hasParams ve hasReturn parametrelerine göre metadata anahtar dizisini döndürsün. buildMetadataKeys(true, true, false) çağrısının diziyi virgülle birleştirip yazdır.
Başlangıç kodu
// buildMetadataKeys: metadata anahtar dizisini üretir
// özellik türü bayrağı açık ise design:type ekle
// parametre türü bayrağı açık ise design:paramtypes ekle
// dönüş türü bayrağı açık ise design:returntype ekle
// (true, true, false) için diziyi join ile yazdırÖrnek çözüm
function buildMetadataKeys(hasType: boolean, hasParams: boolean, hasReturn: boolean): string[] {
const keys: string[] = [];
if (hasType) keys.push("design:type");
if (hasParams) keys.push("design:paramtypes");
if (hasReturn) keys.push("design:returntype");
return keys;
}
console.log(buildMetadataKeys(true, true, false).join(", "));Beklenen çıktı
design:type, design:paramtypes
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 emitDecoratorMetadata hangi kütüphaneler için özellikle gereklidir?
- Bağımlılık enjeksiyonu kütüphaneleri Doğru cevap
- State yönetim kütüphaneleri
- Test kütüphaneleri
- Hata ayıklama kütüphaneleri
Açıklama: Bağımlılık enjeksiyonu kütüphaneleri (NestJS, TypeDI gibi) dekoratör metadata'sına güvenir; hata ayıklama, state yönetimi ve test kütüphaneleri dekoratör metadata gerektirmez.
2 Metadata bayrağını aç
{
"compilerOptions": {
"experimentalDecorators": true,
"____": true
}
}
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
Açıklama: Tür metaverisini çalışma zamanına taşımak için emitDecoratorMetadata kullanılır; emitMetadata, decoratorMetadata ve metadata geçerli seçenek adları değildir.
3 Decorator metadata parçaları
| Kavram | Anlamı |
|---|---|
emitDecoratorMetadata |
tür bilgisini çalışma zamanına taşır |
experimentalDecorators |
dekoratörleri etkinleştirir |
design:type |
özellik türü metadata'sı |
reflect-metadata |
metadata saklayan polyfill |