CodeBlanks Logo Icon CodeBlanks

Decorator metadata

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

index.ts
// 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

index.ts
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ç

Soru
{
  "compilerOptions": {
    "experimentalDecorators": true,
    "____": true
  }
}
Cevap
{
  "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

Uzman bölümündeki tüm dersler