Tip çıkarımı (type inference), TypeScript'in sizin yazmadığınız bir tipi kendisinin bulmasıdır. Bir değişkene başlangıç değeri verin, değerin tipini alır; bir fonksiyondan bir değer döndürün, dönüş tipi de ona göre belirlenir. Çoğu TypeScript kodu, insanların beklediğinden çok daha az notasyon taşır.
Yorumlar, her adın üzerine geldiğinizde bir editörün gösterdiklerini gösteriyor. count hiç notasyon almamış olsa da son satır bir derleme hatasıdır (TS2322); // @ts-expect-error onu beklenen hata olarak işaretler, böylece bloğun geri kalanı çalışır.
let ile const: Literal Genişlemesi
Bir const asla değişemez, bu yüzden TypeScript ona en dar tipi verir: literal değerin kendisini. Bir let ise daha geniş tipi alır, çünkü daha sonra yeniden atanabilir.
let a = "left"; // string
const b = "left"; // "left"
let c = 42; // number
const d = 42; // 42
const e = true; // true
Bu, bir fonksiyon yalnızca belirli değerleri kabul ettiğinde önem kazanır:
index.ts(7,6): error TS2345: Argument of type 'string' is not assignable to parameter of type '"left" | "right"'.
Bunu const ile ya da değişkene notasyon ekleyerek düzeltin: let dir: "left" | "right" = "left". Literal tiplerin kendi sayfası var: literal tipler.
Nesneler ve Diziler Üyelerini Genişletir
Bir nesne literal'inin özellikleri değiştirilebilir, bu yüzden nesnenin kendisi const olsa bile let gibi genişlerler. Dizi elemanları da aynısını yapar. as const her şeyi readonly yapar ve literal tipleri korur.
Dönüş Tipi Çıkarımı
Bir fonksiyonun dönüş tipi return ifadelerinden çıkarılır. Birden fazlası varsa sonuç onların union'ıdır.
Çıkarılan dönüş tipleri çoğu fonksiyon için yeterlidir. İmzanın bir sözleşme olmasını istediğinizde export edilen veya public fonksiyonlarda dönüş tipini açıkça yazın: gövdede farklı bir tip döndüren bir değişiklik o zaman uzaktaki bir çağıranda değil, fonksiyonun kendisinde hata verir.
Bağlamsal Tipler: Callback'ler Tiplerini Alır
Parametreler, fonksiyonun nasıl çağrıldığından çıkarılmaz. İki istisna vardır. Varsayılan değeri olan bir parametre, varsayılanın tipini alır (function retry(times = 3) ifadesi times parametresini number yapar). Ve bir fonksiyon tipinin zaten beklendiği bir yere yazılan fonksiyon, parametre tiplerini o bağlamdan alır; bu yüzden callback parametrelerinin notasyona ihtiyacı yoktur.
Aynısı forEach, filter, reduce, Promise callback'leri, event handler'lar ve fonksiyon tipi bildirilmiş bir parametreye verdiğiniz her fonksiyon için geçerlidir.
Parametreler Notasyon İster
Bir varsayılan değer ya da böyle bir bağlam olmadan TypeScript, parametre tiplerini tahmin etmek için fonksiyonun nasıl çağrıldığına bakmaz. strict açıkken notasyonsuz bir parametre TS7006 hatasıdır:
index.ts(2,17): error TS7006: Parameter 'x' implicitly has an 'any' type.
function double(x: number) yazın, blok 42 yazdırır; dönüş tipi number da x * 2 ifadesinden çıkarılır.
Best Common Type
Farklı türde değerler içeren bir dizi literal'i için TypeScript, bu değerlerin tiplerinin union'ından oluşan bir dizi çıkarır. Sizin belirtmediğiniz ortak bir temel tipi aramaz.
Dikkat edilmesi gereken tek durum boş bir dizidir. const list = [] tipi her push ile büyüyen "evrilen" bir dizi olarak başlar; const list: string[] = [] gibi bir notasyon niyeti baştan belirtir ve daha anlaşılırdır.
Ne Zaman Tip Yazılmalı
| Durum | Notasyon yazılsın mı? |
|---|---|
| Bir değerle başlatılan değişken | Hayır, tipi değer verir |
Değer verilmeden tanımlanan değişken (let result;) | Evet, let result: string; |
| Fonksiyon parametreleri | Evet (bağlamı olan callback'ler veya varsayılan değer hariç) |
| Küçük bir iç fonksiyonun dönüş tipi | İsteğe bağlı |
| Export edilen veya public bir fonksiyonun dönüş tipi | Bir sözleşme olarak önerilir |
| Sonradan dolduracağınız boş dizi veya nesne | Evet, const ids: number[] = [] |
| Değer literal tiplerini korumalı | as const kullanın |
| Değer bir tipe uymalı ama kendi çıkarılan tipini korumalı | satisfies kullanın |
Neyin çıkarıldığını görmenin en hızlı yolu editörünüzde adın üzerine gelmektir. Editör yoksa değeri yanlış tipte bir değişkene atayın, örneğin const probe: boolean = mixed;, derleyicinin hata mesajı çıkarılan tipi söyler.
Sıkça Sorulan Sorular
TypeScript'te tip çıkarımı nedir?
Derleyicinin sizin yazmadığınız bir tipi kendisinin bulmasıdır. let count = 0 ifadesi count değişkenine number tipini verir; iki sayı üzerinde a + b döndüren bir fonksiyon da number dönüş tipini alır. Çıkarılan tip, yazılmış bir tip gibi aynen kontrol edilir.
TypeScript'te her değişkene tip yazmalı mıyım?
Hayır. Fonksiyon parametrelerine (çağrılardan değil, yalnızca bir varsayılan değerden veya callback bağlamından çıkarılırlar), kararlı bir API istiyorsanız export edilen fonksiyonların dönüş tiplerine ve değer verilmeden tanımlanan değişkenlere notasyon yazın. Gerisini TypeScript'in çıkarmasına bırakın: const name: string = "Ada" derleyicinin zaten bildiğini tekrarlar.
Neden const bir literal tip çıkarıyor da let string çıkarıyor?
Bir const asla yeniden atanamaz, bu yüzden const dir = "left" literal tip "left" alır. Bir let daha sonra başka herhangi bir string tutabilir, bu yüzden let dir = "left" tipi string olarak genişletilir. Aynı genişleme bir nesne literal'inin özelliklerinde de olur, çünkü özellikler yeniden atanabilir; as const bunu durdurur.
TypeScript neden bir parametrenin örtük olarak 'any' tipine sahip olduğunu söylüyor?
Bu, strict kapsamındaki noImplicitAny seçeneğinden gelen TS7006 hatasıdır. TypeScript parametre tiplerini fonksiyonun nasıl çağrıldığından çıkarmaz, bu yüzden notasyonsuz bir parametre any olurdu. Bir notasyon ekleyin, function double(x: number), ya da fonksiyonu tipinin bağlamdan bilindiği bir yere, örneğin map için bir callback olarak verin.
TypeScript'in çıkardığı tipi nasıl görebilirim?
Editörünüzde adın üzerine gelin (VS Code ve çoğu editör çıkarılan tipi bir ipucunda gösterir). Kodda ise değeri açıkça yanlış tipte bir değişkene atamak, derleyicinin hata mesajında çıkarılan tipi yazdırmasını sağlar.