Soru Geçmişi:
TypeScript, statik tip kontrolü uygular, bu nedenle bazen bir türü başka bir türe açıkça dönüştürmek gerekir. Örneğin, geliştirici veri yapısını derleyiciden daha iyi biliyorsa veya beklenen ve kaynak türlerinin uyuşmadığı tipli bir API ile çalışmak gerekiyorsa. Bunun için type casting veya tür beyanı mekanizması kullanılır.
Sorun:
TypeScript'teki tür dönüştürme (type casting) hiçbir değer dönüşümü gerçekleştirmez: sadece derleyiciye "bana güven" der. Eğer belirtilen dönüşüm gerçek veri içeriğiyle uyuşmazsa bu hatalara yol açabilir. Hatalar yalnızca çalışma zamanında ortaya çıkar ve derleyici tarafından tespit edilmez.
Çözüm:
TypeScript'te iki tür dönüştürme sözdizimi bulunmaktadır: açılı parantez (eski, JSX için önerilmez) ve as sözdizimi (tavsiye edilen).
Kod Örneği:
// Açılı parantez kullanarak sözdizimi (tsx için değil) let someValue: any = "Hello World"; let strLength: number = (<string>someValue).length; // as kullanarak sözdizimi let strLength2: number = (someValue as string).length; // Nesne tipini dönüştürme (güvenli değil!) interface Cat { meow(): void; } interface Dog { bark(): void; } let dog: Dog = { bark() {} }; let cat = dog as unknown as Cat; // bu yapılabilir, ama tip kontrolünü aşar!
Anahtar Özellikler:
Type assertion, çalışma zamanında değerlerin otomatik dönüşümünü yapar mı, C# veya Java gibi?
Hayır, type assertion sadece derleyiciye bu değişkenin bu türde olduğunu söyler. Hiçbir değer dönüşümü gerçekleşmez - sorumluluk tamamen geliştiricidedir.
Tip A'yı B tipine ortak bir yapı olmadan dönüştürebilir miyiz?
TypeScript bunu yapmanıza izin verir (örneğin any veya unknown aracılığıyla çift dönüşümle), ancak bu tür güvenliğini zedeler ve çalışma zamanında hatalara yol açabilir.
const a = 5 as unknown as string; // güvenli değil!
Any'i karmaşık bir tipe dönüştürmek güvenli mi?
Hayır, any tür kontrolünü devre dışı bırakır: any'den başka bir türe dönüştürmek mümkündür, ancak TypeScript tutarsızlıkları tespit edemeyecektir, herhangi bir hata yalnızca çalışma zamanında ortaya çıkacaktır.
Geliştirici, alınan nesneyi yapı kontrolü yapmadan, basit as SomeType ile beklenen tipe dönüştürür ve iş mantığında kullanır. API'deki bir değişiklik veya sunucudaki bir hata durumunda uygulama, derleme aşamasında hata olmadan çalışma zamanında çökebilir.
Artılar:
Eksiler:
Geliştirici, alınan nesnenin yapısını önceden doğrular, kullanıcı tanımlı bir tip koruma fonksiyonu kullanır ve yalnızca başarılı bir kontrol sonrası type assertion gerçekleştirir.
Artılar:
Eksiler: