---
title: 'Derleme ve Çalıştırma Akışı'
source: 'https://academia.sh/tr/kurslar/typescript/derleme-ve-calistirma-akisi'
course: TypeScript
language: tr
updated: '2026-08-17T18:09:55+00:00'
license: 'CC BY-SA 4.0'
---

# Derleme ve Çalıştırma Akışı

Tip denetimi ile yayın çıktısının ayrılması, hata durumunda yayın davranışı, dosya başına çeviriyi olanaklı kılan seçenekler, tip-yalnızca içe aktarma ve tip soyan çalışma zamanları.

Kurs boyunca derleyici hem tip denetimi yaptı hem çıktı üretti. Bu iki işin ayrılması,
projelerin derleme süresini ve dağıtım düzenini belirleyen bir karardır.

Ayrımın gerekçesi ilk derste kurulmuştu: tipler derleme anında silinir. Silme işlemi
mekanik ve hızlıdır; tip denetimi ise programın tümünü çözümlemeyi gerektirir ve
yavaştır. İki işi ayırmak, geliştirme döngüsünü kısaltır.

## Hata Durumunda Yayın

İlk derste görülen davranışı bir proje bağlamında yeniden inceleyelim. `src/ana.ts`:

```typescript
const deger: number = "21.4";
console.log(deger);
```

Yapılandırma `outDir` ile çıktı üretecek biçimde ayarlanmışsa, derleme şu tanıyı verir:

```text
src/ana.ts(1,7): error TS2322: Type 'string' is not assignable to type 'number'.
```

ve buna rağmen `dist/ana.js` dosyasını yazar:

```javascript
const deger = "21.4";
console.log(deger);
export {};
```

`noEmitOnError` seçeneği bu davranışı değiştirir; aynı derleme tanıyı verir ve `dist`
dizini hiç oluşmaz.

Hangisinin isteneceği bağlama bağlıdır. Geliştirme sırasında, tip hatası olan bir kodu
yine de çalıştırabilmek yararlıdır — hata bir modülde, denenen davranış başka bir
modüldedir. Yayın hattında ise tersi geçerlidir: denetimden geçmeyen kod paketlenmemelidir.
Bu nedenle iki ayrı yapılandırma kullanmak yaygındır.

Sondaki `export {};` satırı ayrı bir ayrıntıdır: derleyici, dosyayı modül olarak işaretlemek
için ekler. Modül Çözümleme dersindeki `moduleDetection` ayarı bu davranışı belirler.

## İki Adıma Ayırma

Ayrım, iki komutla kurulur:

- **Tip denetimi:** `tsc --noEmit`. Çıktı üretmez, yalnızca tanıları verir.
- **Çıktı üretimi:** Dosya başına çalışan bir çevirici. Tipleri siler, sözdizimini hedefe
  uyarlar, tip denetimi yapmaz.

İkinci adımın hızlı olmasının nedeni, **dosya başına** çalışabilmesidir: bir dosyayı
çevirmek için başka dosyalara bakmaya gerek yoktur. Ancak bu, TypeScript'in bazı
yazımlarında olanaksızdır — çevirinin doğru olması için tip bilgisi gerekir.

`isolatedModules` seçeneği, bu yazımları yakalar. Aşağıdaki `src/olcum.ts`:

```typescript
export interface Olcum {
  kimlik: string;
  deger: number;
}

export function ortalama(kayitlar: readonly Olcum[]): number {
  return kayitlar.length === 0
    ? 0
    : kayitlar.reduce((t, k) => t + k.deger, 0) / kayitlar.length;
}
```

ve `src/ana.ts`:

```typescript
import { Olcum, ortalama } from "./olcum.js";

export { Olcum };

const kayitlar: Olcum[] = [{ kimlik: "s-01", deger: 21.4 }];
console.log(ortalama(kayitlar));
```

`isolatedModules` açıkken:

```text
src/ana.ts(3,10): error TS1205: Re-exporting a type when 'isolatedModules' is enabled requires using 'export type'.
```

Sorun şudur: dosya başına çalışan bir çevirici, `Olcum` adının bir tip mi yoksa bir değer
mi olduğunu bilemez. Tipse dışa aktarma satırı tümüyle silinmeli, değerse korunmalıdır.
Karar için `olcum.ts` dosyasına bakmak gerekir ve bu, dosya başına çeviriyi bozar.

`verbatimModuleSyntax` seçeneği aynı kuralı içe aktarmalara da uygular:

```text
src/ana.ts(1,10): error TS1484: 'Olcum' is a type and must be imported using a type-only import when 'verbatimModuleSyntax' is enabled.
src/ana.ts(3,10): error TS1205: Re-exporting a type when 'verbatimModuleSyntax' is enabled requires using 'export type'.
```

Düzeltme, tip-yalnızca yazımları kullanmaktır:

```typescript
import type { Olcum } from "./olcum.js";
import { ortalama } from "./olcum.js";

export type { Olcum };

const kayitlar: Olcum[] = [{ kimlik: "s-01", deger: 21.4 }];
console.log(ortalama(kayitlar));
```

Bu dosya hatasız derlenir. Üretilen `dist/ana.js`:

```javascript
import { ortalama } from "./olcum.js";
const kayitlar = [{ kimlik: "s-01", deger: 21.4 }];
console.log(ortalama(kayitlar));
```

`node dist/ana.js` çıktısı `21.4`tür.

`import type` yazımı, satırın tümüyle silineceğini **bildirimde** söyler. Kazanç yalnızca
hız değildir: içe aktarmanın yan etkisi olan bir modülden yalnızca tip almak, çıktıda o
modülün yüklenmesine yol açmaz. Modüller, Araçlar ve Ekosistem kursundaki ağaç sarsma
konusuyla aynı ilkedir — silinebilecek bağımlılığın silinebilir olduğunun bilinmesi.

## Artımlı Derleme

`incremental` seçeneği, derleyicinin önceki çalışmasından kalan bilgiyi bir dosyaya
yazmasını sağlar. Sonraki derlemede yalnızca değişen dosyalar ve onlara bağlı olanlar
yeniden çözümlenir.

Seçenek açıkken proje kökünde `tsconfig.tsbuildinfo` adlı bir dosya oluşur. Bu dosya
üretilen bir yapıdır; sürüm kontrolüne alınmaz ve temizlik adımlarında silinir. Yeri
`tsBuildInfoFile` ile değiştirilebilir.

İzleme kipi (`tsc --watch`) aynı düşünceyi sürekli çalışan bir sürece taşır: dosya
değişiklikleri izlenir ve yalnızca etkilenen bölüm yeniden denetlenir. Geliştirme
sırasında bu kip, tek seferlik derlemeye yeğlenir.

## Tip Soyan Çalışma Zamanları

Bazı çalışma zamanları TypeScript dosyalarını doğrudan çalıştırabilir: tip açıklamalarını
söker ve kalan JavaScript'i yürütür. Bu, ilk dersteki tip silme ilkesinin çalışma zamanına
taşınmış hâlidir.

Ayrımı görmek gerekir. Aşağıdaki dosya bir tip hatası içerir:

```typescript
const deger: number = "21.4";
console.log(deger);
```

Böyle bir çalışma zamanında dosya çalışır ve `21.4` yazar. **Hiçbir tip denetimi
yapılmaz.** Soyma işlemi mekaniktir; derleyicinin verdiği güvenceyle ilgisi yoktur.

İkinci sınır, kod üreten TypeScript yazımlarında görülür:

```typescript
enum Birim {
  Celsius = "C",
}
console.log(Birim.Celsius);
```

Bu dosya çalışmaz:

```text
SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]: TypeScript enum is not supported in strip-only mode
```

Temel Tipler dersinde numaralandırmanın tip silme ilkesinin istisnası olduğu
gösterilmişti; sonucu burada somutlaşır. Yalnızca silme yapan bir çalışma zamanı,
silinemeyen sözdizimi çalıştıramaz. Aynı kısıt parametre özelliklerini de kapsar.

Bu nedenle `erasableSyntaxOnly` seçeneği, tip soyan bir çalışma zamanı hedefleyen
projelerde açık tutulur: silinemeyen yazımlar derleme anında bildirilir, çalışma zamanında
sürprize dönüşmez.

Üç yolun karşılaştırması:

| Yol | Tip denetimi | Hız | Kısıt |
|---|---|---|---|
| Derleyiciyle derleme | Var | Düşük | — |
| Ayrı denetim + dosya başına çeviri | Ayrı adımda | Yüksek | `isolatedModules` gerekir |
| Tip soyan çalışma zamanı | Yok | Yüksek | Silinemeyen yazım çalışmaz |

Üçünün ortak yanı, tip denetiminin **kaybolmaması** gerektiğidir. İkinci ve üçüncü yolda
denetim bir yerde — yayın hattında, düzenleyicide, işleme öncesi bir kancada — yapılmalıdır.
Yapılmadığında geriye kalan, tip açıklaması yazılmış JavaScript'tir.

## Özet

- Tip hatası kendiliğinden yayını durdurmaz; `noEmitOnError` bunu değiştirir ve geliştirme
  ile yayın için ayrı yapılandırmalar yaygındır.
- Tip denetimi (`tsc --noEmit`) ile çıktı üretimi ayrı adımlara bölünebilir; ikinci adımın
  hızı dosya başına çalışabilmesinden gelir.
- `isolatedModules` ve `verbatimModuleSyntax`, dosya başına çeviriyi bozan yazımları
  bildirir; düzeltme `import type` ve `export type` yazımlarıdır.
- `incremental` seçeneği derleme bilgisini bir dosyaya yazar; bu dosya üretilmiş bir
  yapıdır ve sürüm kontrolüne alınmaz.
- Tip soyan çalışma zamanları hiçbir tip denetimi yapmaz ve silinemeyen yazımları
  çalıştıramaz; `erasableSyntaxOnly` bu yazımları derleme anında yakalar.

## Kurs Kapanışı

Kurs, tek bir soruyla başladı: bir program çalıştırılmadan hakkında ne söylenebilir?
TypeScript'in yanıtı, kaynak kod üzerine kurulan ve çeviri bittiğinde geride kalmayan bir
kanıt katmanıydı.

Bu katmanın sınırları baştan çizildi ve her konuda yeniden sınandı. Tipler derleme anında
silinir; çalışma zamanı davranışını değiştirmez; dış dünyanın biçimini kanıtlamaz. Bu
kısıtlar bir eksiklik değil, katmanın ne olduğunun tanımıdır — ve `paths` ayarının
çalışmayan çıktısı ile tip soyan çalışma zamanının denetimsizliği, aynı kısıtın iki farklı
görünümüdür.

Kurs boyunca tek bir model taşındı. Ölçüm kaydı, hiçbir güvence taşımayan bir JavaScript
nesnesinden başladı; alanları tiplendi, birimi kapalı bir kümeye bağlandı, geçerli ve
hatalı durumları ayırt edici bir birleşimle ayrıldı, kaynağı bir arayüzle soyutlandı,
defteri bir tip parametresiyle genelleştirildi, türevleri eşlenmiş ve koşullu tiplerle
hesaplandı, sınırı bir tip yüklemiyle korundu ve son olarak bir paket bildirimiyle dışa
verildi. Her adımda kazanılan şey aynıydı: çalışma zamanında ortaya çıkacak bir sorunun
derleme anına taşınması.

Kurstan çıkarılacak üç ilke:

**Kanıt sınırda üretilir.** Sistem sınırından gelen veri `unknown` olarak alınır, çalışma
zamanında sınanır ve sonuç tip yüklemiyle kaydedilir. `as` yazımı bir kanıt değil bir
borçtur.

**Model tek yerde durur.** Türev tipler elle yazılmaz, asıl tipten hesaplanır; sabit
listeler hem değer hem tip olarak tek kaynaktan gelir. Modelin büyümesi, onu kullanan kodun
gözden geçirilmesini derleyici aracılığıyla zorunlu kılar.

**Katılık bir tercih değil, bir kapsam kararıdır.** Her bayrak bir hata sınıfına
karşılık gelir; kapalı bırakılan bayrak, o sınıfın çalışma zamanına bırakılması demektir.

Sırada, bu kodun çalışacağı yer var. **Node.js Çalışma Zamanı** kursu sunucu tarafındaki
çalışma zamanını ele alacak: olay döngüsünün aşamaları, dosya sistemi ve ağ arayüzleri,
akışlar ve geri basınç, süreç yönetimi ve üretim koşullarında günlükleme ile izleme. Bu
kursta kurulan tip katmanı orada da geçerlidir — çalışma zamanının sunduğu arayüzler
bildirim dosyalarıyla tiplenmiştir ve modül çözümleme kuralları o çalışma zamanının
kurallarıdır.
