TypeScript'te asenkron işlevler (async/await) her zaman Promise döndürür. Dönüş değerinin tipi şu şekilde belirtilir: Promise<Type>. Fonksiyonu tanımlarken, TypeScript'in içinde yer alan türlerle doğru çalışabilmesi için sonucu açıkça tiplendirmek önemlidir. Ara değerler, tanımlananlarla uyuşmadığında tip hataları meydana gelebilir.
Asenkron fonksiyon:
async function fetchUser(id: number): Promise<User> { const response = await fetch(`/api/user/${id}`); const data: User = await response.json(); return data; }
Eğer fonksiyon bir hata veya reddetme döndürmesi gerekiyorsa, promise'nin tipi hatayı doğrudan tanımlamamalıdır (Promise<Error>), çünkü promise'nin reddi tiplendirilmez ve catch ile yakalanır.
Promise zincirlerinin tiplendirilmesi önemlidir:
function getNumber(): Promise<number> { return Promise.resolve(42); } getNumber().then(val => val.toFixed(2)); // TypeScript, val'in bir sayı olduğunu biliyor
Soru: Asenkron bir fonksiyon, Promise'den başka bir şey döndürebilir mi?
Cevap: Hayır. Asenkron bir fonksiyon her zaman bir Promise nesnesi döndürür. Eğer açıkça bir promise olmayan bir değer döndürülürse, TypeScript otomatik olarak bu değeri bir promise içine sarar.
async function test() { return 1; } const result = test(); type ResultType = typeof result; // Promise<number>
Hikaye
Bir geliştirici, dönüş değerinin belirli bir türde nesne döndüreceğini varsayarak fonksiyonu açık bir şekilde tiplendirmeden yazdı. Mantık değiştiğinde, fonksiyon farklı bir tür döndürmeye başladı ve bu hemen fark edilmedi, çünkü TypeScript tür çıkarımına dayandığı için hata vermedi. Sonunda hatalar yalnızca çalışma zamanında, fonksiyonu kullanan kişi olmayan bir özelliği çağırmaya çalıştığında ortaya çıktı.
Hikaye
Bir projede, promise zincirleri tiplendirilmemişti. Sonucun üzerinde olmayan bir yöntem çağırma girişimi hatalara neden oluyordu. Böylece, sonuç then(response => response.data) ifadesi any olarak kabul ediliyor ve alanlar veya yöntemler üzerinde yakalama hataları yalnızca çalışma zamanında ortaya çıkıyordu. Hata üretime girdi ve yalnızca kullanıcıların yardımıyla ortaya çıkmıştır.
Hikaye
Asenkron bir fonksiyon Promise<Error> tipiyle ilan edildi, bunun hataları yakalamaya izin vereceğini düşündü, ancak aslında hatalar throw aracılığıyla geçmedi ve promise, başka bir değer türü ile reddedildi. Bu, hataların ve geçerli değerlerin dolaylı olarak karışmasına ve promise sonuçlarının işlenmesi mantığında hataların ortaya çıkmasına neden oldu.