TypeScript Tip Sistemi ve Daraltma
30 saniyede özet
as yazmak derleyiciye 'bana güven, sus' demektir; tip daraltma ise ona bir kontrolle kanıt sunar. Ama tip doğru diye mantık da doğru olmaz: !count kontrolü sıfırı da eler.
Kapıdaki görevli kimliğine baktıktan sonra seni içeri alır. Baktıktan sonra artık kim olduğunu bilir ve sana ona göre davranır.
TypeScript de böyle: yaptığın her kontrolü takip eder ve tipi kendiliğinden daraltmaDerleyicinin, yazdığın kontrole bakarak bir değerin tipini daha dar bir tipe indirmesi. `if (!user) return;` sonrası `user` artık null olamaz.Sözlükte gör →.
-
Bayt: Derleyici itiraz edince araya bir as yazdım, hata kayboldu!
-
Sen: Sorun çözüldü mü yani?
-
Bayt: Canlıda bir null geldi ve sayfa çöktü...
-
Bayt: Kapıdaki görevli kimliğe bakmadan herkesi içeri alırsa ne olur?
Adım adım oku
- Değer string, number ya da null olabilir; derleyici üçünü de hesaba katar.
- null kontrolünden sonra derleyici null ihtimalini eler.
- typeof ile string elenince geriye yalnızca number kalır ve cast gerekmez.
- as ise hiçbir şeyi kontrol etmez; yanlış değer de içeri girer ve program çalışırken çöker.
function format(value: string | number | null): string { if (value === null) return "yok"; // value: string | number
if (typeof value === "string") return value.toUpperCase(); // value: number
return value.toFixed(2);}Hiçbir yerde as yok. Her kontrol birleşimden bir olasılık eledi.
Kendin izle
Simülatör satır satır ilerliyor; sağdaki panel derleyicinin o anda ne bildiğini gösteriyor.
TypeScript tip daraltma — derleyici satır satır ne biliyor
Tohum 1- 1
function format(value: string | number | null): string { - 2
if (value === null) { - 3
return "yok"; - 4
} - 5
- 6
if (typeof value === "string") { - 7
return value.toUpperCase(); - 8
} - 9
- 10
return value.toFixed(2); - 11
}
Derleyicinin bildiği tipler
— henüz bir şey yok —
Şu an ne oldu?
Derleyici henüz bir şey bilmiyor
Oynat veya adımla. Her satırdan sonra derleyicinin o değişken hakkında ne bildiği sağda güncellenecek.
Aklında kalsın: Daraltma (narrowing), derleyicinin kontrol akışını takip ederek bir birleşim tipini küçültmesidir. Cast yazmanı gereksiz kılan şey budur.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
Dört senaryoyu da çalıştır — son ikisi kasten bozuk kodu gösteriyor:
Union daraltma— tipin her kontrolde küçüldüğünü izle.Ayrımlı birleşim—defaultdalındashapenasılneveroluyor.any ile unknown— aynı satır, birinde derleme hatası, diğerinde çalışma zamanı çökmesi.Truthy tuzağı— derlenen, tip kontrolünden geçen ve yine de yanlış olan kod.
Kafam karıştı, daha basit anlat
Daraltma, derleyiciye “bak, kontrol ettim” demektir. if ile bir şeyi kontrol ettiğinde, derleyici o bloğun içinde tipin ne olduğunu artık bilir.
`interface` ile `type` arasındaki pratik fark nedir?
as ile daraltmanın farkı
API'den gelen data aslında bir hata nesnesi. Kodda const user = data as User yazıyor. Derleyici bir uyarı verir mi? Cevabı göster
Hayır. as, derleyiciye “ben biliyorum” demektir ve hiçbir şey kontrol edilmez. Hata, user.email ilk okunduğunda çalışma anında çıkar.
// Cast: derleyiciye "sus, ben biliyorum" demek. Hiçbir şey doğrulanmaz.const user = data as User;
// Daraltma: derleyiciye kanıt sunmak.if (typeof data === "object" && data !== null && "email" in data) { // data burada gerçekten o alana sahip}as bir çalışma zamanı kontrolü değildir — derlendikten sonra ortada hiçbir şey kalmaz. Yanlışsa program çöker.
Kafam karıştı, daha basit anlat
as derleyiciye “sus, ben biliyorum” demektir, hiçbir şey kontrol edilmez. Daraltma ise kanıt göstermektir. Kanıt her zaman susturmaktan güvenlidir.
Bu kod ne yazdırır?
Daraltmanın araçları
| Araç | Ne için |
|---|---|
typeof x === "string" | İlkel tipler |
x instanceof Date | Sınıflar |
"email" in obj | Alan varlığı |
x.kind === "circle" | Ayrımlı birleşimler |
Array.isArray(x) | Diziler |
x !== null | null / undefined eleme |
function isUser(x): x is User | Kendi tip koruyucun |
Son satır, kendi kontrolünü derleyiciye tanıtma yoludur:
function isUser(value: unknown): value is User { return typeof value === "object" && value !== null && "email" in value;}
if (isUser(data)) { data.email; // derleyici artık biliyor}Dikkat: value is User bir söztür. Fonksiyonun gövdesi yanlış yazılmışsa derleyici seni yine yanıltır — tip koruyucusu`value is User` imzalı, true dönünce derleyiciye tipi daraltmasını söyleyen fonksiyon. Kontrolü sen yazarsın — gövde yanlışsa derleyici seni durduramaz.Sözlükte gör →lar as’a göre daha iyidir ama sihirli değildir.
Her ifadeyi derleyiciye kanıt sunup sunmadığına göre yerleştir.
Eksik durum kalmasın: never
type Shape = | { kind: "circle"; r: number } | { kind: "square"; side: number };
function area(shape: Shape): number { switch (shape.kind) { case "circle": return Math.PI * shape.r ** 2; case "square": return shape.side ** 2; default: // Tüm varyantlar ele alındıysa shape burada `never` olur. const exhaustive: never = shape; return exhaustive; }}Union’a üçüncü bir varyant eklediğin an, o varyantı ele almayı unuttuğun her switch derleme hatası verir. Bu bir test değil, derleyici garantisidir — ve büyük kod tabanlarında TypeScript’in en değerli özelliklerinden biridir.
Aynı fikir bir banka uygulamasında da işine yarar. Para gönderdikten sonra sunucu üç cevaptan birini döner; bak derleyici hiçbirini unutturmuyor.
Derinleş · Havale sonucu: kanıtla daralt, hiçbir durumu unutma 4 dosya · ~72 satır · ilk okumada atlayabilirsin
Kafam karıştı, daha basit anlat
never “buraya hiçbir zaman gelinmemeli” demektir. Yeni bir şekil ekleyip onu unuttuğunda, derleyici tam o satırı gösterir.
`strictNullChecks` kapalıyken ne kaybedersin?
Tuzaklar: any yerine unknown
const fromApi: any = JSON.parse(raw);fromApi.user.name; // derlenir → user yoksa çalışma zamanında çöker
const safe: unknown = JSON.parse(raw);safe.user; // DERLENMEZ — önce daraltmalısınany tip kontrolünü o değer için kapatır. unknown ise “değer var ama tipini bilmiyorum” der ve kullanmadan önce kanıt ister.
Kural: dışarıdan gelen her veri unknown’dır. JSON.parse, API cevabı, localStorage, form girdisi. Sınırda bir kez doğrula (Zod gibi bir şema doğrulayıcı en pratik yol), içeride tiplerle çalış.
Tip güvenliği ≠ mantık doğruluğu. Bu bölüm dersin en önemli kısmı olabilir.
function label(count: number | undefined): string { if (!count) return "belirtilmedi"; // count === 0 de buraya düşer return `${count} adet`;}
label(0); // "belirtilmedi" ← hata0 falsy’dir. Derleyici itiraz etmez çünkü kod tip açısından tamamen geçerlidir; yanlış olan iş mantığıdır.
function label(count: number | undefined): string { if (count === undefined) return "belirtilmedi"; return `${count} adet`;}Aynı tuzak metinlerde boş string ("") ile kurulur. ?? (nullish coalescing) ile || arasındaki fark da tam burada:
const a = 0 || 10; // 10 — 0 falsy sayıldıconst b = 0 ?? 10; // 0 — yalnızca null/undefined elenirGünlük kullanımda birkaç utility type.
| Tip | Ne yapar |
|---|---|
Partial<T> | Tüm alanlar opsiyonel — güncelleme DTO’ları |
Required<T> | Tüm alanlar zorunlu |
Pick<T, K> / Omit<T, K> | Alan seçme / çıkarma |
Readonly<T> | Değiştirilemez hâle getirir |
Record<K, V> | Anahtar-değer eşlemesi |
ReturnType<F> | Bir fonksiyonun dönüş tipi |
Kendini sına
as, değerin tipini çalışma anında kontrol eder.
Bu fonksiyon `label(0)` için ne döndürür?
Aklında kalacak üç şey
- 1 as derleyiciye susmasını söyler ve hiçbir şeyi kontrol etmez; daraltma if ve typeof gibi kontrollerle kanıt üretir. Kodda çok sayıda as görmek daraltmanın yapılmadığının işaretidir.
- 2 any tip kontrolünü kapatır ve hatayı çalışma anına erteler. Dışarıdan gelen her veri unknown olmalıdır.
- 3 Tip doğru diye kod doğru olmaz: sayılarda 0, metinlerde boş string false sayılır. undefined kontrol edeceksen === undefined yaz.
4 kart sonraki derste seni bekliyor