تایپ Awaited در تایپ اسکریپت یک تایپ utility است که به ما این امکان را می‌دهد تا تایپ مقداری را که یک Promise آن را resolve می‌کند، unwrap کنیم. این موضوع در تایپ اسکریپت بسیار مفید می‌باشد؛ زیرا این زبان برنامه نویسی عمیقاً به تایپ‌ها اهمیت می‌دهد و اطمینان حاصل می‌کند که همیشه از تایپ یک مقدار مشخص آگاه باشیم.

تایپ Awaited در تایپ اسکریپت چگونه کار می‌کند؟

تعریف بیسیک یک Promise را در نظر می‌گیریم. اگر Promiseای داریم که به یک رشته resolve می‌شود، تایپ آن Promise<string> خواهد بود. اگر می‌خواهیم بدانیم که Promise به چه تایپی مربوط می‌شود (که در این مثال string است)، می‌توانیم از تایپ Awaited استفاده کنیم.

موارد استفاده از تایپ Awaited در تایپ اسکریپت

مثال ساده‌ای را در نظر می‌گیریم:

type MyPromise = Promise<string>;

type ResolvedType = Awaited<MyPromise>;  // This is equivalent to type ResolvedType = string

در این مثال، ResolvedType از تایپ string خواهد بود، زیرا این تایپی است که MyPromise آن را resolve می‌کند.

Promiseهای تودرتو

یکی از ویژگی‌های کلیدی تایپ 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ها دریافت خواهیم کرد، شناسایی می‌کند.

چرا باید از تایپ Awaited در تایپ اسکریپت استفاده کنیم؟

در حالی که تایپ اسکریپت اغلب می‌تواند تایپ resolve شده یک Promise را در بسیاری از contextها (مانند یک تابع async) استنتاج کند، اما سناریوهایی وجود دارد که صریح بودن می‌تواند وضوح بیشتری را ارائه دهد، یا به دلیل پیچیدگی‌های سیستم تایپ تایپ اسکریپت ضروری می‌باشد.

علاوه بر این، تایپ Awaited می‌تواند به ویژه در contextهای generic که تایپ دقیق آن‌ها در یک Promise ناشناخته است، بسیار مفید باشد.

مواردی که هنگام کار با تایپ Awaited باید به آن‌ها توجه کنیم:

  1. مدیریت خطاها: لازم به ذکر است که تایپ Awaited احتمال رد شدن یک Promise را در نظر نمی‌گیرد. یعنی فرض بر این است که Promise با موفقیت resolve می‌شود. بنابراین، همیشه باید احتمال‌های رد شدن Promise را در کد واقعی خود مدیریت کنیم.
  2. Runtime نبودن این ویژگی: مانند همه تایپ‌های موجود در تایپ اسکریپت، تایپ Awaited نیز در زمان اجرا وجود ندارد. این ویژگی صرفا یک ساختار زمان کامپایل می‌باشد.
  3. نسخه تایپ اسکریپت: تایپ Awaited در نسخه ۴٫۱ تایپ اسکریپت معرفی شده است. در نتیجه، باید مطمئن شویم که برای بهره‌مندی از این تایپ utility، از این نسخه یا نسخه‌های جدیدتر تایپ اسکریپت استفاده می‌کنیم.

بررسی تایپ Awaited در اپلیکیشن‌های عملی: توابع Async

هنگامی که با توابع 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ها فراهم می‌کند و دستکاری‌های مربوط به تایپ را در سناریوهای مختلف واضح‌تر و شهودی‌تر می‌نماید.