تایپ Awaited در تایپ اسکریپت یک تایپ utility است که به ما این امکان را میدهد تا تایپ مقداری را که یک Promise
آن را resolve میکند، unwrap کنیم. این موضوع در تایپ اسکریپت بسیار مفید میباشد؛ زیرا این زبان برنامه نویسی عمیقاً به تایپها اهمیت میدهد و اطمینان حاصل میکند که همیشه از تایپ یک مقدار مشخص آگاه باشیم.
تعریف بیسیک یک Promise
را در نظر میگیریم. اگر Promise
ای داریم که به یک رشته resolve میشود، تایپ آن Promise<string>
خواهد بود. اگر میخواهیم بدانیم که Promise
به چه تایپی مربوط میشود (که در این مثال string
است)، میتوانیم از تایپ Awaited استفاده کنیم.
مثال سادهای را در نظر میگیریم:
type MyPromise = Promise<string>; type ResolvedType = Awaited<MyPromise>; // This is equivalent to type ResolvedType = string
در این مثال، ResolvedType
از تایپ string
خواهد بود، زیرا این تایپی است که MyPromise
آن را resolve میکند.
یکی از ویژگیهای کلیدی تایپ Awaited، توانایی آن در مدیریت مقادیر Promise
تودرتو است. موقعیتی را در نظر میگیریم که در آن یک Promise
داریم که به یک Promise
دیگر resolve شده و سپس به یک عدد resolve میشود:
type NestedPromise = Promise<Promise<number>>;
اگر از تایپ Awaited در NestedPromise
استفاده کنیم، داخلیترین تایپ مقدار resolve شده را دریافت خواهیم کرد:
type ResolvedNestedType = Awaited<NestedPromise>; // This is equivalent to type ResolvedNestedType = number
حتی اگر NestedPromise
ما دو لایه عمیقتر هم باشد، تایپ Awaited به درستی تایپی را که در نهایت پس از resolve شدن همه Promiseها دریافت خواهیم کرد، شناسایی میکند.
در حالی که تایپ اسکریپت اغلب میتواند تایپ resolve شده یک Promise
را در بسیاری از contextها (مانند یک تابع async) استنتاج کند، اما سناریوهایی وجود دارد که صریح بودن میتواند وضوح بیشتری را ارائه دهد، یا به دلیل پیچیدگیهای سیستم تایپ تایپ اسکریپت ضروری میباشد.
علاوه بر این، تایپ Awaited میتواند به ویژه در contextهای generic که تایپ دقیق آنها در یک Promise
ناشناخته است، بسیار مفید باشد.
هنگامی که با توابع async
سروکار داریم، تایپ اسکریپت اغلب به طور خودکار تایپ بازگشتی را استنباط میکند. اما برای وضوح بیشتر تایپ یا هنگام تعریف قراردادهای تایپ (مانند interfaceها یا type aliasها)، تایپ Awaited میتواند کمک بزرگی به ما کند.
یک تابع سرویس API را در نظر میگیریم:
interface ApiService { fetchData: () => Promise<SomeDataType>; }
اگر در حال نوشتن تابعی هستیم که fetchData
را فراخوانی کرده و نتیجه آن را پردازش میکند، ممکن است از Awaited برای پی بردن به تایپ دقیق آن استفاده کنیم:
type FetchedData = Awaited<ReturnType<ApiService['fetchData']>>;
در این مثال، FetchedData
از تایپ SomeDataType
است، که به ما یک رفرنس مستقیم به تایپ دادههای دریافت شده بدون wrap promise شده میدهد.
به طور خلاصه، تایپ Awaited در تایپ اسکریپت راهی قدرتمند برای استنباط و کار با مقادیر resolve شده promiseها فراهم میکند و دستکاریهای مربوط به تایپ را در سناریوهای مختلف واضحتر و شهودیتر مینماید.