TYPESCRIPT STRICT MODE VE TSCONFIG

TypeScript strict mode kalkanı üzerinde tik işareti ve etrafında küçük kilit ikonları tip güvenliği sembolü

Microsoft'un kendi VS Code repo migrasyonunda strict mode aktif edildiğinde 30'dan fazla gizli null/undefined hatası ortaya çıkmıştı; Airbnb mühendislik blogu ise JavaScript'ten TypeScript'e geçişle production bug'larında yaklaşık %38'lik bir düşüş raporladı. Bu sayıların büyük kısmı tek bir bayrağa, yani strict: true'ya bağlı. Strict mode, derleyiciye "varsayımlarımı sorgula" demenin kısayolu — ve genellikle bir hafta sonu uğraş, aylarca dinlenen runtime hatalarını kapatıyor.

Strict Mode Aslında Ne Açıyor?

tsconfig.json içinde "strict": true tek satır gibi görünür ama altında yedi-sekiz ayrı bayrağı tetikler. Bu bayrakların her biri farklı bir bug sınıfını yakalar:

  • noImplicitAny: Tipi yazılmamış parametre ve değişkenler artık sessizce any olamaz.
  • strictNullChecks: null ve undefined diğer tiplerden ayrı tutulur — "milyar dolarlık hata"nın panzehri.
  • strictFunctionTypes: Fonksiyon parametre tipleri kontravaryant kontrol edilir.
  • strictBindCallApply: bind/call/apply çağrılarındaki argümanlar denetlenir.
  • strictPropertyInitialization: Class property'lerinin constructor'da atanmış olması zorunlu hale gelir.
  • noImplicitThis: Belirsiz this referansları derlemez.
  • alwaysStrict: Emit edilen JS'in tepesine "use strict" eklenir.
  • useUnknownInCatchVariables: catch (e) bloğunda e artık any değil unknown.

Microsoft'un TypeScript ekibinin 2019'da paylaştığı verilere göre VS Code kod tabanında sadece strictNullChecks açılırken bulunan ve düzeltilen hata sayısı 4.500'ün üzerindeydi — çoğu kullanıcının hiç fark etmediği sessiz undefined erişimleriydi. Konuyu daha derinlemesine incelemek isteyenler için detaylı kılavuzu faydalı bir başlangıç noktasıdır.

strictNullChecks: En Büyük Kazanç

Strict mode bayraklarından sadece birini açacak vaktiniz varsa, kanıtlar bunun strictNullChecks olması gerektiğini söylüyor. Tony Hoare'in "milyar dolarlık hata" olarak adlandırdığı null referansları, modern web uygulamalarındaki çökme bug'larının başlıca kaynağı.

Klasik bir örnek:

function getLength(s: string) { return s.length; } — strict mode kapalıyken getLength(null) derleme zamanında geçer, kullanıcı sayfayı açtığında "Cannot read properties of null" hatası alır. Açıkken aynı satır derlemez; derleyici sizi s: string | null imzasına ve içeride bir guard yazmaya zorlar.

user değişken kutusuna null etiketi üzerinde kırmızı çizgi strictNullChecks yakalama diyagramı

Airbnb Raporu: Sayılarla Tip Güvenliği

Airbnb mühendislerinden Brie Bunge'nin 2019 JSConf Hawaii sunumunda paylaştığı analiz, geçmişteki postmortem'lerin %38'inin TypeScript tarafından önlenebileceğini gösterdi. Bu oran, neredeyse her üç production incident'ten birinin tek satır tsconfig değişikliğiyle elenebileceği anlamına geliyor.

Aynı analizde öne çıkan bug kategorileri:

  1. Tanımsız property'lere erişim (undefined access)
  2. Yanlış argüman tipi gönderilen fonksiyon çağrıları
  3. Boş veya nullable değerlerin filtrelenmemesi
  4. Refactor sonrası unutulan kullanım noktaları
  5. API yanıtlarının yanlış varsayılan şekli

Bu kalemlerin tamamı, strict mode aktifken derleyici hatası olarak yüzeye çıkıyor — yani sürüm öncesi, kullanıcıdan önce.

tsconfig.json: Pratik Kurulum

Yeni bir proje başlatıyorsanız strict mode'u ilk taahhütten itibaren açık tutmak en kolayı:

{ "compilerOptions": { "strict": true, "noUncheckedIndexedAccess": true, "exactOptionalPropertyTypes": true } }

Buradaki ek iki bayrak strict: true'nun parçası değildir ama strict felsefesinin doğal uzantısıdır. noUncheckedIndexedAccess array ve obje indekslemelerine | undefined ekler — arr[0]'ın boş bir dizide ne döndüğünü hatırlatır. exactOptionalPropertyTypes ise { name?: string } tipine açıkça undefined atamayı engeller.

Mevcut Projeye Kademeli Geçiş

Mevcut bir kod tabanında strict: true bir anda açıldığında binlerce hatayla karşılaşmak yaygın. Microsoft'un TypeScript ekibinin VS Code migrasyonunda kullandığı yaklaşım, bayrakları teker teker açmak:

  • Önce noImplicitAny — implicit any'leri temizleyin.
  • Sonra strictNullChecks — en zor adım, en büyük kazanç.
  • Ardından strictFunctionTypes ve strictBindCallApply — görece kolay.
  • Son olarak strictPropertyInitialization — class-heavy kodda dikkatli olun.

Dosya bazlı geçiş için // @ts-strict yorum bayrakları veya typescript-strict-plugin gibi araçlar kullanılabilir; bunlar tek dosyayı strict moda almanızı sağlar. Temel TypeScript yapılandırma kavramlarını derinleştirmek isterseniz TypeScript eğitimi içeriğinden yararlanabilirsiniz.

Strict Mode'un Yakaladığı Tipik Bug Sınıfları

Topluluk raporlarında ve şirket postmortem'lerinde sürekli karşımıza çıkan örüntüler şunlar:

  • API yanıtlarındaki opsiyonel alanların guard'sız kullanımı — özellikle user.address.city gibi zincirler.
  • Array.prototype.find sonucunun undefined olabileceğinin unutulması.
  • Refactor sonrası fonksiyona null geçilebilecek yeni bir caller eklenmesi.
  • JSON.parse çıktısının any sanılması — unknown olmalı.
  • Map/Set .get() dönüşlerinin doğrudan kullanılması.
tsconfig kartı üzerinde strict true toggle ve yedi adet alt bayrak chip kademeli yapı

Maliyet ve Geri Dönüş

Strict mode'un ücreti, eski kod tabanında bir defalık temizlik iş yüküdür. Geri dönüşü ise her PR'da, her refactor'da, her yeni geliştiricinin onboarding'inde tekrar tekrar alınır. Airbnb ve Microsoft gibi büyük ölçekli ekiplerin sayıları gösteriyor: derleyiciye "şüpheli ol" demek, üç haneli sayıda runtime hatasını sessizce eler. tsconfig'inizde strict: true satırı yoksa, kod tabanınız size hâlâ söylemediği bir şeyler söylemeye çalışıyor. TypeScript dilinin daha geniş özelliklerini ve tip sistemini öğrenmek için TypeScript eğitimi kaynağını inceleyebilirsiniz.