TYPESCRIPT STRICT MODE VE TSCONFIG

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.
1. 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
anyolamaz. - strictNullChecks:
nullveundefineddiğ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
thisreferansları derlemez. - alwaysStrict: Emit edilen JS'in tepesine "use strict" eklenir.
- useUnknownInCatchVariables:
catch (e)bloğundaeartıkanydeğilunknown.
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.
2. 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.

3. 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:
- Tanımsız property'lere erişim (undefined access)
- Yanlış argüman tipi gönderilen fonksiyon çağrıları
- Boş veya nullable değerlerin filtrelenmemesi
- Refactor sonrası unutulan kullanım noktaları
- 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.
4. 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.
5. 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
strictFunctionTypesvestrictBindCallApply— 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.
6. 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.citygibi zincirler. Array.prototype.findsonucununundefinedolabileceğinin unutulması.- Refactor sonrası fonksiyona
nullgeçilebilecek yeni bir caller eklenmesi. - JSON.parse çıktısının
anysanılması —unknownolmalı. - Map/Set
.get()dönüşlerinin doğrudan kullanılması.

7. 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.
Sıkça Sorulan Sorular
tsconfig'de strict: true tek başına yeterli mi yoksa ek bayraklar gerekli mi?
strict: true sekiz bayrağı birden açar ve çoğu proje için makul bir başlangıçtır. Ancak noUncheckedIndexedAccess ve exactOptionalPropertyTypes strict paketinin dışındadır; array indeksleme ve opsiyonel property davranışını sıkılaştırmak için bunları ayrıca eklemeniz önerilir.
Mevcut JS projesinde strict mode'u açtığımda binlerce hata alıyorum, ne yapmalıyım?
Bayrakları teker teker açın. Önce noImplicitAny, ardından strictNullChecks ile başlayın. Dosya bazlı geçiş için typescript-strict-plugin kullanılabilir. Migrasyonu PR'lara böl, her sprintte bir modülü strict'e taşıyın; tek seferde yapmaya çalışmak genellikle başarısız olur.
strictNullChecks neden 'milyar dolarlık hatayı' çözdüğü söylenen bayrak?
Tony Hoare null referansını icat etmesini 'milyar dolarlık hata' olarak tanımladı. strictNullChecks açıkken null ve undefined ayrı tipler haline gelir, bir değişkene null atayabilmek için tipinde açıkça yazılması gerekir. Bu, runtime'daki 'cannot read property of null' hatalarının büyük çoğunluğunu derleme zamanında elimine eder.
Airbnb'nin %38 bug azalması raporu güvenilir mi?
Bu sayı Brie Bunge'nin 2019 JSConf Hawaii sunumundan geliyor ve Airbnb'nin altı aylık postmortem analizine dayanıyor. Tüm bug'ların değil, kayda alınmış incident'lerin geriye dönük TypeScript ile önlenip önlenemeyeceği değerlendirildi. Sayı projeye göre değişse de tip güvenliğinin yönü konusunda güçlü bir sinyaldir.
noUncheckedIndexedAccess neden varsayılan olarak strict içinde değil?
Bu bayrak çok agresif kabul edildiği için strict paketine dahil edilmedi. Açıldığında arr[0] tipi T yerine T | undefined olur; bu da mevcut kodda yüzlerce yeni hata üretebilir. Yeni projelerde açmak doğru karar; eski projelerde son aşamada ele alınır.
strictPropertyInitialization sınıflarımı bozdu, nasıl çözerim?
Üç seçenek var. Property'yi constructor'da başlatın, opsiyonel yapın (name?: string), veya kesin atama operatörü kullanın (name!: string). Bağımlılık enjeksiyonu ile dolan property'lerde definite assignment yaygın çözümdür. Decorator tabanlı framework'lerde bayrağı dosya başına devre dışı bırakmak da kabul edilebilir.
useUnknownInCatchVariables ne işe yarar ve neden önemli?
TypeScript 4.4 ile gelen bu bayrak, catch (e) bloğunda e'nin tipini any yerine unknown yapar. Bu, hata nesnesini kullanmadan önce tip kontrolüne zorlar. JavaScript'te throw edilen her şey hata nesnesi olmayabilir, dolayısıyla unknown daha doğru bir varsayılan ve runtime hatalarını önler.


