TypeScript'te bir promise'in tipi Promise<T>'dir; burada T, promise'in resolve olduğu değerin tipidir. Promise döndüren bir fonksiyon bunu dönüş tipinde belirtir ve then ya da await ile aldığınız değer T tipindedir.
Promise'in işleyişi (durumlar, microtask kuyruğu, zincirleme) düz JavaScript'tir ve JavaScript promise'leri sayfasında anlatılır. Bu sayfa tiplerle ilgilidir.
new Promise ve resolve'u Tiplemek
new Promise, dönüş tipi belirtilmiş bir fonksiyonun dönüş değeri olduğunda T oradan gelir. Tek başına kullanıldığında TypeScript T'yi resolve çağrılarından çıkarmaz ve Promise<unknown> elde edersiniz. Tip argümanını açıkça verin:
İki ayrıntı var. resolve tipini T'den alır, bu yüzden bir Promise<number> içinde resolve("42") bir derleme hatasıdır. Argümansız resolve() ise yalnızca T içinde void varsa kabul edilir: bir Promise<number> içinde bu TS2794 hatasıdır (Expected 1 arguments, but got 0. Did you forget to include 'void' in your type argument to 'Promise'?).
reject tarafı tiplenmez. Promise<T, E> diye bir şey yoktur: bir promise herhangi bir değerle reject olabilir.
then, catch ve finally
Her then, callback'inin döndürdüğü şeye göre tiplenmiş yeni bir promise döndürür. Callback bir promise döndürürse TypeScript onu açar, bu yüzden hiçbir zaman Promise<Promise<T>> elde etmezsiniz.
catch callback'inin parametresi standart kütüphanede unknown değil any olarak tiplenmiştir. String olabilecek bir değer üzerinde e.message yazmanızı hiçbir şey engellemez. Yukarıdaki gibi unknown olarak işaretleyin ve kullanmadan önce daraltın. await etrafındaki try/catch daha iyisini yapar: strict altında catch değişkeni zaten unknown olur (bkz. hata yönetimi).
Promise.all Bir Tuple Döndürür
Farklı promise tiplerinden oluşan bir dizi literal'i verildiğinde Promise.all, her konumun kendi tipini koruduğu bir tuple'ın promise'ini döndürür:
Promise olmayan değerler de araya karıştırılabilir ve olduğu gibi geçer. Promise.all, bir girdi reject olur olmaz reject olur ve diğer sonuçlar kaybolur. Promise.race ilk sonuçlanan girdiyle resolve ya da reject olur ve girdilerin union'ı olarak tiplenir; Promise.any ilk başarılı sonuçla resolve olur ve yalnızca bütün girdiler başarısız olursa bir AggregateError ile reject olur.
Promise.allSettled ve Sonuç Tipi
Promise.allSettled her girdiyi bekler ve asla reject olmaz. Her sonuç, status alanıyla daralttığınız bir union olan PromiseSettledResult<T> tipindedir:
r.value yalnızca status kontrolünden sonra vardır, çünkü reject olan varyantta value yoktur. reason, catch'teki aynı nedenle any'dir. filter, filtrelenmiş dizinin fulfilled sonuçlar olarak tiplenmesi için bir type predicate kullanır.
Callback API'sini Promise ile Sarmak
Eski API'ler sonuçları bir callback üzerinden bildirir, çoğu zaman Node tarzında (err, result) => void biçiminde. Onları bir kez tipli bir promise döndüren bir fonksiyonla sarın, kodun geri kalanı await kullanabilir:
Node'da util.promisify, (err, result) kuralını izleyen fonksiyonlar için bunu yapar; birçok yerleşik modülün de zaten promise sürümleri vardır (node:fs/promises, node:timers/promises).
Sık Yapılan Hatalar
- İmza
Promise<T>derkenTdöndürmek ya da tersi.Promise<User>olarak tanımlanmış async olmayan bir fonksiyon bir promise döndürmek zorundadır; birasyncfonksiyon ise otomatik olarak bir promise döndürür. - Bir promise'i ele almayı unutmak.
await,thenya dacatcholmadan yazılmışsave(user);gibi bir çağrı sorunsuz derlenir ve bir reject, ele alınmamış bir reddedilmeye dönüşür (bu da varsayılan olarak bir Node sürecini sonlandırır). typescript-eslint'inno-floating-promiseskuralı bunları yakalar. .catch((e) => ...)tipine güvenmek. Buradakie,any'dir.unknownolarak işaretleyin.- Zaten promise döndüren bir şeyin etrafında
new Promisekullanmak. Var olan promise'i doğrudan döndürün ya daawaitedin.
Sıkça Sorulan Sorular
TypeScript'te Promise<T> nedir?
Promise<T>, T tipinde bir değerle resolve olan bir promise'in tipidir. Promise<string> döndüren bir fonksiyon, then callback'i ya da await ile bir string veren bir promise döndürür. Hiçbir değerle resolve olmayan bir promise Promise<void> tipindedir.
TypeScript'te new Promise nasıl tiplenir?
Tip argümanını verin: new Promise<number>((resolve, reject) => ...). Bu olmadan TypeScript değeri resolve çağrılarından çıkaramaz ve sonuç Promise<unknown> olur. Hiçbir şeyle resolve olmayan bir promise için new Promise<void>(resolve => ...) kullanın; böylece argümansız resolve() çağrısına izin verilir.
Promise catch içindeki hatanın tipi nedir?
any. Standart kütüphanede catch callback'inin reason parametresi any olarak tiplenmiştir, çünkü her şey throw ya da reject edilebilir. Onu kendiniz unknown olarak işaretleyin (.catch((e: unknown) => ...)) ve kullanmadan önce instanceof Error ile daraltın.
TypeScript'te Promise.all tiplerle nasıl çalışır?
Bir dizi literal'i üzerinde Promise.all, her girdi için sırayla bir eleman içeren bir tuple tipi döndürür: Promise.all([getUser(), getCount()]) sonucu Promise<[User, number]> olur, bu yüzden destructuring her değere kendi tipini verir. Aynı tipten bir dizi, T[], üzerinde ise Promise<T[]> döndürür.
Promise.all ile Promise.allSettled arasındaki fark nedir?
Promise.all, girdilerden biri reject olur olmaz reject olur. Promise.allSettled ise her zaman resolve olur ve PromiseSettledResult<T> nesnelerinden oluşan bir dizi verir: { status: "fulfilled", value } ya da { status: "rejected", reason }. Her birini daraltmak için status alanını kontrol edin.