---
title: 'Derleyici Yapılandırması'
source: 'https://academia.sh/tr/kurslar/typescript/derleyici-yapilandirmasi'
course: TypeScript
language: tr
updated: '2026-08-17T18:09:55+00:00'
license: 'CC BY-SA 4.0'
---

# 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ı.

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:

```json
{
  "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:

```json
{
    "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:

```typescript
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:

```text
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:

```typescript
class OlcumDefteri {
  ad: string;
  kayitlar: number[] = [];
}

try {
  throw new Error("kayit okunamadi");
} catch (hata) {
  console.log(hata.message);
}
```

```text
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 `unknown`dur ve `any`, `unknown` ve `never` dersindeki kural geçerlidir — daraltmadan
kullanılamaz.

Düzeltilmiş biçim:

```typescript
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ı:

```text
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:

```typescript
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:

```text
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.
