الواجهات وأنواع الكائنات
صِف بنية الكائنات باستخدام interface وtype، ووسّع الواجهات، واستخدم الخصائص الاختيارية مع ?، وreadonly لفرض عدم القابلية للتغيير.
الواجهات وأنواع الكائنات درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
interface مقابل type
يصف كل من interface وtype بنية الكائنات. والفرق الرئيسي هو أن الواجهات يمكن دمجها (دمج التصريحات)، ويُفضّل استخدامها عمومًا لتعريف بنى واجهات برمجة التطبيقات العامة. أما الأسماء المستعارة للنوع type فهي أكثر مرونة مع الأنواع المعقدة.
// interface:
interface User {
id: number;
name: string;
}
// type alias (equivalent for objects):
type User = {
id: number;
name: string;
};تعريف واجهة
استخدموا interface لتعريف بنية كائن. تكون جميع الخصائص مطلوبةً افتراضيًا. افصلوا بين الخصائص باستخدام الفواصل المنقوطة.
interface Product {
id: number;
name: string;
price: number;
description: string;
inStock: boolean;
category: string;
}الخصائص الاختيارية وخصائص القراءة فقط
حدّدوا الخصائص الاختيارية باستخدام ?. واستخدموا readonly لمنع التعديل. يفرض readonly عدم القابلية للتغيير وقت الترجمة.
interface Config {
host: string;
port?: number; // optional: number | undefined
readonly apiKey: string; // can't change after assignment
}
const config: Config = { host: 'localhost', apiKey: 'abc' };
config.port = 8080; // OK
config.apiKey = 'new'; // Error: readonlyتوسيع الواجهات
استخدموا extends لإنشاء واجهة جديدة تتضمن جميع خصائص واجهة أخرى. ويُدعم التوريث المتعدد.
interface Animal {
name: string;
sound(): string;
}
interface Dog extends Animal {
breed: string;
fetch(): void;
}
interface ServiceDog extends Dog {
task: string;
}توقيعات الفهرس — المفاتيح الديناميكية
عندما لا تعرفون أسماء الخصائص مسبقًا، لكنكم تعرفون أنواع قيمها، استخدموا توقيع فهرس.
interface StringMap {
[key: string]: string;
}
const headers: StringMap = {
'Content-Type': 'application/json',
'Authorization': 'Bearer token123'
};
// Also for translating:
interface Translations {
[locale: string]: { [key: string]: string };
}أنواع الدوال في الواجهات
عرّفوا توقيعات الأساليب داخل الواجهة؛ إذ تعمل كل من الصيغة المختصرة وصيغة الخصائص الكاملة.
interface Logger {
log(message: string): void;
warn(message: string): void;
error(message: string, err?: Error): void;
}
// Also valid:
interface Logger2 {
log: (message: string) => void;
}تطبيق الواجهات في الأصناف
يمكن للصنف استخدام implement مع واجهة واحدة أو أكثر. ويتحقق TypeScript من أن الصنف يوفّر جميع الأعضاء المطلوبة.
interface Serialisable {
serialise(): string;
deserialise(data: string): this;
}
class User implements Serialisable {
constructor(public name: string) {}
serialise() { return JSON.stringify({ name: this.name }); }
deserialise(data: string) {
const obj = JSON.parse(data);
return new User(obj.name) as this;
}
}دمج التصريحات
تُدمج عدة تصريحات interface تحمل الاسم نفسه في تصريح واحد. وهذا مفيد لتوسيع أنواع الجهات الخارجية. ولا تدعم الأسماء المستعارة للأنواع ذلك.
interface Window {
myPlugin: { version: string };
}
// Now window.myPlugin is typed everywhereأنواع الكائنات المتداخلة
يمكن أن تكون خصائص الواجهة نفسها من أنواع الكائنات، سواء عُرّفت داخلها مباشرةً أو عبر الإشارة إلى واجهة أخرى.
interface Order {
id: string;
customer: {
name: string;
email: string;
};
items: Array<{
productId: string;
quantity: number;
price: number;
}>;
total: number;
}الأنماط البنيوية — كتابة البط
يستخدم TypeScript الكتابة البنيوية: تستوفي قيمة ما نوعًا معينًا إذا احتوت على الخصائص المطلوبة على الأقل. ولا حاجة إلى استخدام implements صراحةً. فأي كائن ذي البنية الصحيحة يكون متوافقًا.
interface Named {
name: string;
}
function greet(obj: Named) {
console.log(`Hello, ${obj.name}!`);
}
// No 'implements Named' needed:
greet({ name: 'Alice', age: 30 }); // OK — has the name propertyالاتحادات المميَّزة مع الواجهات
أضيفوا خاصية مميِّزة من نوع حرفي للتمييز بين المتغيرات في الاتحاد. ويضيّق TypeScript النوع في switch أو if استنادًا إلى الخاصية المميِّزة.
interface Circle { kind: 'circle'; radius: number; }
interface Square { kind: 'square'; side: number; }
type Shape = Circle | Square;
function area(shape: Shape): number {
switch (shape.kind) {
case 'circle': return Math.PI * shape.radius ** 2;
case 'square': return shape.side ** 2;
}
}تحقق سريع
ما الفرق الرئيسي بين interface وtype في TypeScript؟
خلاصة: الواجهات
يصف interface بنى الكائنات باستخدام خصائص مطلوبة واختيارية وخصائص للقراءة فقط. وسّعوا الواجهات باستخدام extends. استخدموا توقيعات الفهرس للمفاتيح الديناميكية. تطبّق الأصناف الواجهات. ودمج التصريحات ميزة تنفرد بها الواجهات. يستخدم TypeScript الكتابة البنيوية؛ فالبنية هي المهمة، لا التصريح الصريح.
الأسئلة الشائعة
هل درس «الواجهات وأنواع الكائنات» مجاني؟
نعم — نص درس «الواجهات وأنواع الكائنات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «الواجهات وأنواع الكائنات»؟
صِف بنية الكائنات باستخدام interface وtype، ووسّع الواجهات، واستخدم الخصائص الاختيارية مع ?، وreadonly لفرض عدم القابلية للتغيير. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الواجهات وأنواع الكائنات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا TypeScript: الأنواع تكتشف الأخطاء أثناء الترجمة
- الأنواع البدائية والاتحادات والأسماء المستعارة للأنواع
- الواجهات وأنواع الكائنات
- ترجمة TS وtsconfig.json