كيفية العمل مع TypeScript والوعود
يعمل TypeScript على تعزيز تطوير JavaScript من خلال إضافة أنواع ثابتة. عند العمل باستخدام كود غير متزامن، تُستخدم الوعود للتعامل مع العمليات التي تكتمل في المستقبل. يوفر TypeScript أدوات لإدارة الوعود مع الحفاظ على سلامة النوع والوضوح. يستكشف هذا الدليل كيفية العمل بالوعود في TypeScript، من الاستخدام الأساسي إلى السيناريوهات المتقدمة.
فهم الوعود
يعد promise كائنًا يمثل اكتمال أو فشل عملية غير متزامنة في النهاية. ويوفر طرقًا للتعامل مع نتيجة العملية أو خطأها. في TypeScript، يمكن كتابة الوعود للتأكد من حلها باستخدام نوع البيانات المتوقع.
الاستخدام الأساسي للوعود
إن إنشاء الوعود واستخدامها في TypeScript أمر بسيط. فيما يلي مثال على وعد يتم حله بسلسلة:
function fetchData(): Promise {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Data fetched successfully!");
}, 1000);
});
}
fetchData().then((data) => {
console.log(data); // Outputs: Data fetched successfully!
}).catch((error) => {
console.error("Error:", error);
});
في هذا المثال، تقوم fetchData بإرجاع وعد يتم حله باستخدام سلسلة. تتولى طريقة then التعامل مع القيمة المحلولة، بينما تتولى طريقة catch التعامل مع أي أخطاء.
التعامل مع الوعود باستخدام Async/Await
يدعم TypeScript صيغة async/await، والتي توفر طريقة أكثر قابلية للقراءة للعمل مع الوعود. فيما يلي كيفية استخدام async/await مع الوعود:
async function fetchDataAsync(): Promise {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Data fetched successfully!");
}, 1000);
});
}
async function processData() {
try {
const data = await fetchDataAsync();
console.log(data); // Outputs: Data fetched successfully!
} catch (error) {
console.error("Error:", error);
}
}
processData();
في هذا المثال، تم إعلان الدالة fetchDataAsync على أنها async، مما يسمح لها باستخدام الكلمة الأساسية await للانتظار حتى يتم حل الوعد. يتم اكتشاف الأخطاء باستخدام كتلة try/catch.
كتابة الوعود باستخدام Generics
يتيح TypeScript تحديد نوع البيانات التي يحلها الوعد باستخدام الأنواع العامة. وهذا يضمن إدارة الأنواع بشكل صحيح في جميع أنحاء الكود. فيما يلي مثال على وعد مكتوب:
interface User {
id: number;
name: string;
}
function fetchUser(): Promise {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({ id: 1, name: "John Doe" });
}, 1000);
});
}
fetchUser().then((user) => {
console.log(user.id, user.name); // Outputs: 1 John Doe
}).catch((error) => {
console.error("Error:", error);
});
في هذا المثال، يقوم fetchUser بإرجاع وعد يتم حله باستخدام كائن User. يتم تحديد النوع باستخدام العناصر العامة، مما يضمن سلامة النوع.
استخدام الوعود في TypeScript مع مكالمات API
غالبًا ما تُستخدم الوعود مع مكالمات واجهة برمجة التطبيقات للتعامل مع جلب البيانات غير المتزامنة. يساعد نظام النوع الخاص بـ TypeScript في إدارة الاستجابات من واجهات برمجة التطبيقات:
async function getUserData(userId: number): Promise {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error("Network response was not ok.");
}
const data: User = await response.json();
return data;
}
getUserData(1).then((user) => {
console.log(user);
}).catch((error) => {
console.error("Error:", error);
});
يوضح هذا المثال كيفية استخدام fetch لإجراء مكالمة API ومعالجة الاستجابة باستخدام الوعود وasync/await. تتم كتابة الاستجابة على هيئة User، مما يضمن سلامة النوع.
خاتمة
يوفر العمل بالوعود في TypeScript أمانًا معززًا للنوع ووضوحًا للعمليات غير المتزامنة. من خلال استخدام نظام الكتابة في TypeScript، وقواعد النحو async/await، والأنواع العامة، يمكن للمطورين إدارة الوعود بشكل فعال وبناء تطبيقات أكثر موثوقية.