🔷 شرح TypeScript

البرمجة غير المتزامنة

تنميط الوعود (Promise)

الدالة async تُرجع دائمًا Promise<T> حيث T نوع القيمة النهائية:

async function getNumber(): Promise<number> {
  return 42;
}

getNumber().then((n) => console.log(n));   // n من النوع number

await مع الأنواع

async function loadUser(): Promise<string> {
  const name = await getNameFromServer();
  return name.toUpperCase();
}

جلب البيانات بأمان (fetch)

fetch يُرجع any بعد .json() — نحدّد النوع المتوقّع:

interface User {
  id: number;
  name: string;
}

async function fetchUser(id: number): Promise<User> {
  const res = await fetch(`/api/users/${id}`);
  const data: User = await res.json();
  return data;
}

const user = await fetchUser(1);
console.log(user.name);   // name متاح ومنمَّط

معالجة الأخطاء في async

async function safeLoad(): Promise<User | null> {
  try {
    const res = await fetch("/api/user");
    if (!res.ok) {
      throw new Error("فشل الطلب");
    }
    return await res.json();
  } catch (error) {
    console.error(error);
    return null;
  }
}

تنفيذ متوازٍ (Promise.all)

async function loadAll(): Promise<[User, User]> {
  return Promise.all([fetchUser(1), fetchUser(2)]);
}

أخطاء شائعة

  • نسيان أن نوع الإرجاع من async يُلَفّ في Promise تلقائيًّا.
  • الثقة بـ res.json() بلا تحديد نوع — تحقّق من البيانات أو نمّطها.

🎯 التالي: المُزخرِفات (Decorators).