Ders 19 / 23
Derleyici Yapılandırması
Yapılandırma dosyasının yapısı, katılık şemsiyesi ve alt bayrakları, şemsiye dışındaki ek katılık seçenekleri ve hedef ile kitaplık ayarları.
İçindekiler
Buraya kadar tüm örnekler tek dosyalık ve elle verilmiş seçeneklerle çalıştı. Gerçek bir projede seçenekler bir yapılandırma dosyasında toplanır.
Bu dosya, derleyicinin hangi dosyaları okuyacağını, ne kadar katı davranacağını ve ne üreteceğini belirler. Katılık düzeyi bir tercih değil, hangi hata sınıflarının yakalanacağı kararıdır; bu ders o kararı örneklerle kurar.
Yapılandırma Dosyasının Yapısı
Yapılandırma dosyası tsconfig.json adıyla proje kökünde durur:
{ "compilerOptions": { "target": "es2022", "module": "nodenext", "moduleResolution": "nodenext", "strict": true, "noUncheckedIndexedAccess": true, "exactOptionalPropertyTypes": true, "noImplicitOverride": true, "noUnusedLocals": true, "noEmit": true }, "include": ["src"] }
İki bölüm vardır. compilerOptions derleyicinin davranışını, include ise hangi
dosyaların projeye ait olduğunu belirler. exclude ile alt kümeler dışlanabilir; extends
ile başka bir yapılandırma dosyası temel alınabilir.
Derleyicinin gerçekte hangi ayarlarla çalıştığı sorulabilir. Proje dizininde
tsc --showConfig komutu, varsayılanlarla tamamlanmış yapılandırmayı yazar:
{ "compilerOptions": { "target": "es2022", "module": "nodenext", "moduleResolution": "nodenext", "strict": true, "noUncheckedIndexedAccess": true, "exactOptionalPropertyTypes": true, "noImplicitOverride": true, "noUnusedLocals": true, "noEmit": true, "moduleDetection": "force" }, "files": [ "./src/olcum.ts" ], "include": [ "src" ] }
Çıktıda iki şey görülür. files listesi, include deseninin çözülmüş hâlidir — hangi
dosyaların gerçekten denetlendiği burada doğrulanır. moduleDetection seçeneği ise
yazılmadığı hâlde eklenmiştir; derleyicinin doldurduğu varsayılanlardır ve sürüme göre
değişebilir. Bir davranışın nereden geldiği araştırılırken ilk bakılacak yer bu çıktıdır.
Katılık Şemsiyesi
strict tek bir seçenek değil, bir grup seçeneği birlikte açan şemsiyedir. Etkisi,
aynı dosyayı iki ayarla derleyerek görülür:
interface Olcum { kimlik: string; deger: number; } function ortalama(kayitlar) { return kayitlar.length; } const kayit: Olcum = null; console.log(ortalama([kayit]), kayit.deger);
"strict": false ile derlendiğinde derleyici hiçbir tanı üretmez. "strict": true ile:
src/gevsek.ts(6,19): error TS7006: Parameter 'kayitlar' implicitly has an 'any' type. src/gevsek.ts(10,7): error TS2322: Type 'null' is not assignable to type 'Olcum'.
Aynı kaynak, aynı derleyici, iki farklı sonuç. Katılık kapalıyken tip katmanı yalnızca
yazılmış tipleri sınar; null her tipe girer, tipsiz parametreler denetlenmez. Bu, ilk
derste sözü edilen “kademeli eklenebilirlik” tasarımının bir sonucudur ve var olan bir
JavaScript kod tabanına geçişte anlamlıdır. Yeni bir projede kapalı bırakılması, tip
katmanının verdiği güvencenin büyük bölümünden vazgeçmek demektir.
Şemsiyenin altındaki başlıca seçenekler ve yakaladıkları:
| Seçenek | Yakaladığı |
|---|---|
noImplicitAny |
Tipi yazılmamış ve çıkarılamayan parametreler |
strictNullChecks |
null ve undefined değerlerin sessizce kullanılması |
strictFunctionTypes |
Fonksiyon parametrelerinde yön kuralının çiğnenmesi |
strictBindCallApply |
call, apply ve bind çağrılarında yanlış argümanlar |
strictPropertyInitialization |
Yapıcıda değer verilmeyen sınıf alanları |
noImplicitThis |
Tipi belirsiz this bağlamı |
useUnknownInCatchVariables |
Yakalanan hatanın tipinin varsayılması |
alwaysStrict |
Çıktının katı kipte üretilmemesi |
Bu listenin sürümlerle büyüyebileceği unutulmamalıdır: strict açıkken derleyici
yükseltmesi yeni tanılar getirebilir. Bu, istenen bir davranıştır — yeni denetimler, daha
önce yakalanamayan hataları görünür kılar.
Son iki satırın etkisi tek örnekte görülür:
class OlcumDefteri { ad: string; kayitlar: number[] = []; } try { throw new Error("kayit okunamadi"); } catch (hata) { console.log(hata.message); }
t1.ts(2,3): error TS2564: Property 'ad' has no initializer and is not definitely assigned in the constructor. t1.ts(9,15): error TS18046: 'hata' is of type 'unknown'.
İkinci tanı önemli bir kuralı hatırlatır: JavaScript’te throw deyimi herhangi bir değeri
atabilir, dolayısıyla yakalanan değerin Error olduğu varsayılamaz. Katı yapılandırmada
tip unknowndur ve any, unknown ve never dersindeki kural geçerlidir — daraltmadan
kullanılamaz.
Düzeltilmiş biçim:
class OlcumDefteri { kayitlar: number[] = []; constructor(readonly ad: string) {} } try { throw new Error("kayit okunamadi"); } catch (hata) { console.log(hata instanceof Error ? hata.message : String(hata)); } console.log(new OlcumDefteri("kazan-2").ad);
Çıktı:
kayit okunamadi kazan-2
Şemsiye Dışındaki Katılık
Bazı katılık seçenekleri strict içinde değildir, çünkü var olan kodda çok sayıda tanı
üretirler. Kursta iki kez sözü edilen boşluğu kapatanlar bunlar arasındadır:
interface Olcum { kimlik: string; deger: number; not?: string; } const kayitlar: Olcum[] = [{ kimlik: "s-01", deger: 21.4 }]; const ilk = kayitlar[0]; console.log(ilk.deger); const yama: Olcum = { kimlik: "s-02", deger: 22.1, not: undefined };
Yukarıdaki yapılandırmayla derlendiğinde:
src/olcum.ts(10,13): error TS18048: 'ilk' is possibly 'undefined'.
src/olcum.ts(12,7): error TS2375: Type '{ kimlik: string; deger: number; not: undefined; }' is not assignable to type 'Olcum' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the types of the target's properties.
Types of property 'not' are incompatible.
Type 'undefined' is not assignable to type 'string'.
src/olcum.ts(12,7): error TS6133: 'yama' is declared but its value is never read.
Üç ayrı seçenek üç tanı üretmiştir.
noUncheckedIndexedAccess, indeksli erişimin sonucuna undefined ekler. Arayüzler
dersinde işaret edilen boşluk budur: kayitlar[0] ifadesi boş bir dizide undefined
verir ve tip bunu artık kaydeder. Bedeli, her indeksli erişimden sonra bir denetim
gerekmesidir; kazancı, dizinin boş olabildiği yerlerin görünür hâle gelmesidir.
exactOptionalPropertyTypes, seçmeli alanı “yok” ile “değeri undefined” arasında
ayırır. Bu ayarla not?: string bildirimi, alanın bulunmayabileceğini söyler; alana
açıkça undefined yazmak ayrı bir şeydir ve reddedilir. İkisinin ayrılması, JSON
dizileştirmesinde önemlidir — bulunmayan alan çıktıda yer almaz, undefined değerli alan
da yer almaz ama ayrıştırma sonrası ikisi ayırt edilemez.
noUnusedLocals, kullanılmayan yerel bildirimleri bildirir. Statik çözümleme
araçlarının işiyle örtüşür; hangisinin sorumlu olacağı proje kararıdır.
Bu üç seçenek yeni projelerde açık başlatılabilir. Var olan bir projeye eklenirken tanı sayısı yüksek olabilir; kademeli açma stratejisi JavaScript ile Birlikte Çalışma dersinde ele alınacaktır.
Hedef ve Kitaplık
Üç seçenek, kodun hangi ortamda çalışacağını belirler.
target, üretilecek JavaScript’in dil düzeyini belirler. Değer düşürüldüğünde
derleyici, hedefte bulunmayan sözdizimini karşılığıyla değiştirir — sınıf alanları,
eşzamansız fonksiyonlar ve isteğe bağlı zincirleme dönüştürülür. Bu, ilk derste kurulan
tip silme ilkesinden ayrı bir işlemdir: tipler her hedefte silinir, sözdizim dönüşümü ise
hedefe bağlıdır.
lib, hangi yerleşik tip bildirimlerinin bulunacağını belirler. target değeri
varsayılanı belirler, ancak ayrıca yazılabilir. Tarayıcı arayüzleri kullanılıyorsa DOM
bildirimleri eklenir; sunucu tarafında gerekmez.
module ve moduleResolution, modüllerin nasıl üretileceğini ve nasıl
bulunacağını belirler. Modül Çözümleme dersinin konusudur.
Bu üç ayarın ortak yanı, tip katmanına değil çıktıya ve ortama ait olmalarıdır. Katılık bayrakları hangi hataların yakalanacağını, bu üçü ise kodun nerede çalışacağını söyler.
Özet
- Yapılandırma dosyası derleyici seçeneklerini ve proje kapsamını belirler;
tsc --showConfigçıktısı varsayılanlarla tamamlanmış hâli ve çözülmüş dosya listesini verir. strictbir şemsiyedir; kapalıykennullher tipe girer ve tipsiz parametreler denetlenmez.- Şemsiyenin içeriği sürümlerle büyüyebilir; derleyici yükseltmesinin yeni tanılar getirmesi beklenen bir davranıştır.
noUncheckedIndexedAccessindeksli erişimeundefinedekler,exactOptionalPropertyTypesalanın yokluğu ileundefineddeğerini ayırır; ikisi de şemsiyenin dışındadır.target,libvemoduleayarları tip katmanına değil çıktıya ve çalışacağı ortama aittir.
Sonraki Adım
Yapılandırma, projenin kendi dosyalarını denetlemeyi sağlar. Peki dışarıdan gelen kod — tip bilgisi taşımayan bir kütüphane, çalışma zamanının sağladığı genel nesneler — nasıl tiplenir? Sonraki ders bildirim dosyalarını, ortam bildirimlerini ve tip tanımlarının gerçekleştirimden ayrı taşınmasını ele alacak.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.