اكتب دوالًا وأنواعًا قابلة لإعادة الاستخدام تحافظ على دقة الأنواع كاملة في كل استدعاء.
افتح هذا الدرس في Kodokonأنت تستخدم الأنواع العامة بالفعل دون أن تدرك: string[]، Promise<number>... حان وقت كتابة أنواعك الخاصة. يُدخِل النوع العام معامل نوع، وهو متغير يُستبدَل بنوع محدد عند كل استخدام. الهدف: اكتب المنطق مرة واحدة، دون التضحية بدقة الأنواع.
function first<T>(items: T[]): T | undefined {
return items[0];
}
const n = first([10, 20, 30]);
const s = first(["a", "b"]);لاحظ أنك لم تحدد شيئًا عند موضع الاستدعاء: يقوم TypeScript بـاستنتاج T من المعطى (argument). النوع العام غير المقيَّد يقبل أي شيء؛ ومع ذلك، كثيرًا ما تحتاج الدالة إلى حد أدنى من الضمانات حول بياناتها. تفرض كلمة extends شكلًا أدنى على T.
interface HasId {
id: number;
}
function findById<T extends HasId>(
items: T[],
id: number
): T | undefined {
return items.find((item) => item.id === id);
}يمكن للأنواع نفسها أن تكون عامة. هذا هو الواقع اليومي في شيفرة الشبكة: بنية الاستجابة ثابتة، ولا يتغير سوى محتوى data. عندئذٍ يصف نوع واحد جميع استجابات واجهات API لديك.
interface ApiResponse<T> {
ok: boolean;
data: T;
}
type UserResponse = ApiResponse<{ name: string }>;
const res: UserResponse = {
ok: true,
data: { name: "Ada" },
};