TypeScript ekibi, 6.0 sürümüyle birlikte yeni bir derleyici bayrağı yayınladı: --noPropertyAccessFromIndexSignature. Etkinleştirildiğinde derleyici, bir indeks imzasından gelen özelliklere nokta notasyonuyla erişilmesine izin vermez; bunun yerine geliştiricileri köşeli parantez notasyonu kullanmaya zorlar ve potansiyel undefined değerlerini üretim ortamında (production) değil, derleme zamanında ortaya çıkarır.

Bu bayrak neden önemli?

JavaScript'te nesneler genellikle sözlük (dictionary) görevi görür ve TypeScript, bu tür yapıları bir indeks imzasıyla, örneğin Record<string, T> şeklinde tiplendirmenize olanak tanır. Dil, obj.key ve obj["key"] ifadelerini birbirinin yerine kullanılabilir olarak değerlendirir; bu nedenle anahtarın yalnızca çalışma zamanında bilindiği durumlarda bile derleyici özelliğin mevcut olduğunu varsayar. Bu sessiz varsayım, birçok çökmenin kaynağıdır: obj.missingProp ifadesine erişen kod sorunsuz derlenir, çalışır ve ardından değer undefined olduğu için hata verir.

Nokta notasyonu örtük bir garanti taşır; okuyuculara ve tip denetleyicisine özelliğin kesinlikle mevcut olduğunu söyler. Buna karşılık köşeli parantez notasyonu belirsizlik sinyali verir; anahtar eksik olabilir ve sonuç undefined dönebilir. --noPropertyAccessFromIndexSignature, bu görsel ve anlamsal ayrımı zorunlu kılarak bir grup çalışma zamanı hatasını derleme zamanı teşhislerine dönüştürür.

Bayrak nasıl çalışır?

Bayrak açıldığında, bir indeks imzası aracılığıyla nokta notasyonuyla bir özelliğe erişen her ifade hata olarak işaretlenir. Kodun köşeli parantez kullanacak şekilde yeniden yazılması gerekir:

// Before
const name = userData.name;          // OK even if "name" is not in the index

// After enabling the flag
const name = userData["name"];       // Error unless brackets are used

Derleyici daha sonra köşeli parantez erişimi için halihazırda kullandığı aynı undefined işleme kurallarını uygular. Eğer --noUncheckedIndexedAccess bayrağı da etkinse, userData["name"] tipi T | undefined haline gelir ve geliştiriciyi eksik durumu kontrol etmeye zorlar.

Pratik taşıma adımları

  1. tsconfig.json dosyasında bayrağı etkinleştirin:

    {
      "compilerOptions": {
        "noPropertyAccessFromIndexSignature": true
      }
    }
    
  2. Tip denetleyicisini çalıştırın. İndeks imzası anahtarlarına yapılan tüm nokta notasyonu erişimleri hata olarak görünecektir.

  3. Noktaları köşeli parantezlerle değiştirin. Bu değişiklik mekaniktir; çalışma zamanı performansını etkilemez.

  4. Oluşan undefined tiplerini ele alın. Gerektiğinde nullish coalescing, optional chaining veya açık kontroller ekleyin.

  5. En güçlü güvenlik ağı için --noUncheckedIndexedAccess ile eşleştirmeyi düşünün. Birlikte, sözlük tarzı tüm erişimlerin potansiyel olarak eksik olabileceği şeklinde ele alınmasını sağlarlar.

Hangi durumlarda açık (explicit) özellikler tutulmalı?

Eğer bir alan istikrarlı bir API sözleşmesinin parçasıysa, bir indeks imzasına güvenmek yerine onu açık bir özellik olarak tanımlayın. Açık özellikler nokta notasyonuna izin vermeye devam ederek, alanın (tip sistemi doğrulayabildiği kadarıyla) her zaman mevcut olacağı garantisini korur. İndeks imzalarını, anahtarların önceden bilinmediği gerçekten dinamik veriler için saklayın.

Karşı görüş: artan söz kalabalığı (verbosity)

Bazı ekipler, özellikle esnek nesnelerin yoğun kullanıldığı kod tabanlarında, fazladan köşeli parantezleri gürültülü bulabilir. Bayrak, eski projeler için büyük bir yeniden düzenleme (refactor) gerektirebilecek daha sıkı bir disiplin dayatır. Bu tür durumlar için bayrak, geniş kod tabanı zamanla bu deseni benimserken, belki de sadece yeni modüllerle sınırlı olacak şekilde kademeli olarak uygulanabilir.

Sırada ne var?

Bu bayrak, TypeScript 6.0 ile birlikte daha sıkı tip güvenliğine yönelik daha geniş bir hamlenin parçasıdır. Gelecekteki sürümler; nesne yayma (object spread), optional chaining veya çıkarılan (inferred) any kullanımı etrafında ek kontroller getirebilir. TypeScript yol haryasını takip etmek, ekiplerin teslimat programlarını aksatmadan bir sonraki güvenlik özelliklerini ne zaman benimseyeceklerine karar vermelerine yardımcı olacaktır.

Özet: --noPropertyAccessFromIndexSignature bayrağını etkinleştirmek, "bu özellik garantidir" ile "bu özellik eksik olabilir" arasındaki ayrımı kodda açık hale getirerek, bir dizi hatayı üretim ortamına ulaşmadan yakalar. Sessiz bir çalışma zamanı hatasını derleme zamanı hatasına dönüştürmek, güvenilirlik üzerinde orantısız bir etkiye sahip küçük bir değişikliktir.