TypeScript Type Inference Otomatik Tipler
TypeScript'te her değişkenin başına tip yazmak zorunda değilsin. Derleyici çoğu tipi kendi bulur. Buna type inference yani tür çıkarımı denir. Doğru kullanıldığında kod hem kısalır hem de daha güvenli olur. Çünkü elle yazdığın tip yanlış olabilir; çıkarılan tip ise koddaki gerçeği yansıtır.
Aşağıdaki adımları kendi projende deneyerek ilerle. Boş bir klasör aç, npm init -y ve npm i -D typescript ile başla. npx tsc --init çalıştır, strict: true açık kalsın. Editörde tipi görmek için değişkenin üzerine gel; ipucu balonunda çıkarılan tip yazar.
Type Inference Nasıl Çalışır?
TypeScript, atadığın değere bakar ve en uygun tipi seçer. Bu seçim bazen geniş, bazen dar olur. Farkı bilmek işin yarısı.
let, const ve tip genişlemesi
const ile tanımlarsan literal tip çıkar. let ile tanımlarsan tip genişler.
- const durum = "aktif" → tip "aktif" (literal).
- let durum = "aktif" → tip string.
- const sayi = 42 → tip 42; let sayi = 42 → number.
Bu davranışa "widening" denir. Neden önemli? Bir fonksiyon sadece "aktif" | "pasif" kabul ediyorsa, let ile tanımlanmış bir string'i vermeye çalıştığında hata alırsın. Çözüm: değişmeyecek değerleri const ile yaz.
Fonksiyon dönüş tipi ve bağlamsal tipleme
Dönüş tipini yazmayı çoğu zaman atlayabilirsin.
- function topla(a: number, b: number) { return a + b } → dönüş number olarak çıkar.
- Parametreler istisna. Onları yazman gerekir, çünkü çağrı yerinden bakıp tahmin edilmez.
- Ama callback parametreleri çıkarılır: [1,2,3].map(n => n * 2) içinde n zaten number.
Buna bağlamsal tipleme (contextual typing) denir. Bir fonksiyonu, tipi bilinen bir yere verirsen parametreleri kendiliğinden tiplenir. addEventListener("click", e => ...) içinde e'yi MouseEvent diye yazmak gereksizdir.
Nesne ve dizilerde çıkarım
Nesne literal'inde her alan ayrı ayrı çıkarılır.
- const user = { id: 1, ad: "Ada" } → { id: number; ad: string }.
- Dizilerde eleman tipleri birleştirilir: [1, "a"] → (string | number)[].
- Boş dizi [] tehlikelidir; any[] ya da "evolving any" olur. İlk atamada tipini belli et.
Kural olarak: değişkene tip yazmak yerine, değeri düzgün yaz. Çıkarılan tip zaten doğru olacak.
Az Tip Yazarak Daha Sağlam Kod
Şimdi çıkarımı kontrol altına alma teknikleri. Bunlar tekrar eden tip tanımlarını ortadan kaldırır.
as const ve satisfies
as const tüm nesneyi salt okunur ve literal yapar.
- const roller = ["admin", "editor"] as const → readonly ["admin", "editor"].
- Sonra tip üret: type Rol = typeof roller[number] → "admin" | "editor".
- Yeni rol eklediğinde tip kendiliğinden güncellenir. Tek kaynak, iki iş.
satisfies ise şekli doğrular ama çıkarımı bozmaz. const renkler = { ana: "#111", ikincil: "#eee" } satisfies Record<string, string> yazdığında hem yazım hatası yakalanır hem de anahtarlar literal kalır. Klasik : Record<string, string> yazımı bu detayı kaybettirir.
typeof, ReturnType ve türetilmiş tipler
Var olan bir değerden tip türetmek, ikinci kez tip yazmaktan iyidir.
| Amaç | Yazım |
|---|---|
| Değerden tip almak | typeof config |
| Fonksiyon dönüşü | ReturnType<typeof createUser> |
| Dizi eleman tipi | typeof liste[number] |
| Promise içi | Awaited<ReturnType<typeof fetchUser>> |
Böylece kod değiştiğinde tipler peşinden gelir. Elle senkron tutmaya çalışmazsın.
Generic'lerde çıkarım
Generic fonksiyon yazarken tip argümanını çağrı sırasında vermek genelde gereksizdir.
- function ilk<T>(dizi: T[]) { return dizi[0] } → ilk([1,2]) çağrısı number döner.
- Daha dar sonuç istiyorsan kısıt ekle: <T extends string>.
- Nesne anahtarları için: function al<T, K extends keyof T>(o: T, k:
© 2026 Yazılım Atölyesi