- Konu sahibi
- #1
Bir union type içindeki değeri daraltmak için, değeri kullanmadan önce olası türleri ayıran bir koşul yazın. Örneğin
Union type, bir değerin birden fazla türden biri olabileceğini belirtir. Tür daraltma ise bir koşul ve programın izlediği yol üzerinden o noktadaki olasılıkları azaltır. Koşulun kendisi çalışma zamanında değerlendirilirken TypeScript, kodu kontrol ederken bu koşuldan yararlanır.
Aşağıdaki varsayımsal örneği bir
İlk çağrı
Daraltma kodun ilgili noktasındaki bilgiye dayanır. Değişkene daha sonra başka bir değer atanırsa TypeScript yeni durumu dikkate alır; önceki daraltmanın her yerde geçerli kalacağını varsaymayın.
Birden fazla nesne türü için her üyede bulunan ve her üyeye özgü sabit bir değer taşıyan özellik kullanmak, dalları açıkça ayırır. Buna ayırt edici union denir:
İlk çağrı
Ortak bir ayırt edici özellik yoksa
Union içinde
Daraltma, dışarıdan gelen verinin doğruluğunu otomatik olarak garanti etmez. Özellikle API yanıtı veya kullanıcı girdisi beklenen yapıda olmayabilir; kullanmadan önce gerekli özellikleri ve değer türlerini çalışma zamanında doğrulayın.
string | number için typeof kontrolü yaparsanız TypeScript, koşulun her dalında hangi türün geçerli olduğunu anlar ve o türe özgü işlemlere izin verir. Nesne türlerini ayırmak içinse ortak bir ayırt edici özellik veya uygun bir özellik kontrolü kullanabilirsiniz.İlkel türleri typeof ile ayırın
Union type, bir değerin birden fazla türden biri olabileceğini belirtir. Tür daraltma ise bir koşul ve programın izlediği yol üzerinden o noktadaki olasılıkları azaltır. Koşulun kendisi çalışma zamanında değerlendirilirken TypeScript, kodu kontrol ederken bu koşuldan yararlanır.
Aşağıdaki varsayımsal örneği bir
.ts dosyasına koyun ve TypeScript projenizde derleyip oluşan JavaScript’i çalıştırın:
Kod:
function bicimlendir(deger: string | number): string {
if (typeof deger === "string") {
return deger.toUpperCase();
}
return deger.toFixed(2);
}
console.log(bicimlendir("merhaba"));
console.log(bicimlendir(12));
İlk çağrı
MERHABA, ikinci çağrı 12.00 çıktısını üretir. Koşul doğruysa TypeScript değeri string olarak görür; dolayısıyla toUpperCase() kullanılabilir. İlk dal return ile bittiğinden sonraki satıra yalnızca sayı ulaşır ve toFixed() kullanılabilir. Kontrol öncesinde bu yöntemlerden birini doğrudan çağırmak hata verir; çünkü her iki türde de bulunmazlar.Daraltma kodun ilgili noktasındaki bilgiye dayanır. Değişkene daha sonra başka bir değer atanırsa TypeScript yeni durumu dikkate alır; önceki daraltmanın her yerde geçerli kalacağını varsaymayın.
Nesneleri ayırt edici bir özellikle daraltın
Birden fazla nesne türü için her üyede bulunan ve her üyeye özgü sabit bir değer taşıyan özellik kullanmak, dalları açıkça ayırır. Buna ayırt edici union denir:
Kod:
type Sonuc =
| { durum: "basarili"; veri: string }
| { durum: "hata"; mesaj: string };
function goster(sonuc: Sonuc): string {
if (sonuc.durum === "basarili") {
return sonuc.veri.toUpperCase();
}
return `Hata: ${sonuc.mesaj}`;
}
console.log(goster({ durum: "basarili", veri: "tamam" }));
console.log(goster({ durum: "hata", mesaj: "Kayıt bulunamadı" }));
İlk çağrı
TAMAM, ikincisi Hata: Kayıt bulunamadı üretir. durum kontrolünden sonra başarılı dalda veri, diğer dalda mesaj erişilebilir. Daha fazla durum olduğunda aynı özellik switch ile de kontrol edilebilir.Ortak bir ayırt edici özellik yoksa
"ozellik" in nesne kontrolü, ilgili özelliğin bulunmasına göre türü daraltabilir. Ancak isteğe bağlı bir özellik her iki dalda da olası kalabilir; ayrıca in özelliğin değerinin beklenen türde olduğunu tek başına doğrulamaz. Sınıf örneklerinde ise uygun olduğunda instanceof kullanılabilir.Null kontrolleri ve tür iddialarının sınırı
Union içinde
null veya undefined varsa, değeri kullanmadan önce bunları ayrıca ayırın. Örneğin deger != null koşulu ikisini de dışlar. Boş metin veya 0 gibi değerler geçerliyse yalnızca if (deger) kullanmayın; bu kontrol onları da yanlış kabul eder. Ayrıca typeof null sonucu "object" olduğundan, nesne kontrolünde null durumunu ayrı ele alın.Daraltma, dışarıdan gelen verinin doğruluğunu otomatik olarak garanti etmez. Özellikle API yanıtı veya kullanıcı girdisi beklenen yapıda olmayabilir; kullanmadan önce gerekli özellikleri ve değer türlerini çalışma zamanında doğrulayın.
deger as string gibi bir tür iddiası da kontrol yapmaz veya değeri dönüştürmez; yalnızca TypeScript’e tür hakkında güvenmesini söyler. Yanlış bir iddia çalışma zamanı hatasını gizleyebilir.