İçeriğe geç
academia.sh

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.
  • strict bir şemsiyedir; kapalıyken null her 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.
  • noUncheckedIndexedAccess indeksli erişime undefined ekler, exactOptionalPropertyTypes alanın yokluğu ile undefined değerini ayırır; ikisi de şemsiyenin dışındadır.
  • target, lib ve module ayarları 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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat