TypeScript: الأسماء المستعارة للأنواع في TypeScript (type)

آخر تحديث: 2026-08-26

يُطلق الاسم المستعار للنوع اسمًا على النوع — فهو لا ينشئ نوعًا جديدًا، بل يمنح النوع الموجود اسمًا أقصر وأكثر دلالة.

1. القواعد الأساسية لأسماء الأنواع المستعارة

(1) أنواع التسمية

TYPESCRIPT
type ID = number;
type Name = string;
type Active = boolean;

let userId: ID = 42;
let userName: Name = "Charlie";
let isActive: Active = true;

(2) الأسماء المستعارة لأنواع الكائنات

TYPESCRIPT
type User = {
  name: string;
  age: number;
  email: string;
};

let user: User = {
  name: "Charlie",
  age: 20,
  email: "xiaoming@example.com"
};
💡 يمكن لكل من type وinterface تحديد بنية كائن ما— تختلف صيغة الكتابة قليلاً (type تستخدم =, while interface بينما interface لا تستخدمها)، لكن النتيجة متطابقة تقريبًا.

(3) الأسماء المستعارة لأنواع الدوال

TYPESCRIPT
type GreetFunction = (name: string) => string;

let greet: GreetFunction = (name) => `Hello,${name}!`;

console.log(greet("Charlie"));  // "Hello,Charlie!"


2. الأسماء المستعارة لأنواع الاتحاد

النوع: الاستخدام الأكثر شيوعًا — تسمية أنواع الاتحاد، مما يحسّن قابلية قراءة الكود بشكل كبير:

(1) ربط السلاسل

TYPESCRIPT
type Status = "pending" | "active" | "completed" | "cancelled";
type Role = "admin" | "editor" | "viewer";
type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";

let orderStatus: Status = "pending";
let userRole: Role = "admin";
let method: HttpMethod = "GET";

(2) التقارب الرقمي

TYPESCRIPT
type HttpStatus = 200 | 301 | 400 | 404 | 500;
type Bit = 0 | 1;

let code: HttpStatus = 200;
let flag: Bit = 1;

(3) التركيبة الهجينة

TYPESCRIPT
type Result = string | Error;
type Id = number | string | undefined;

let output: Result = "Success";
output = new Error("Failure");  // ✅ That's also legal

▶ مثال: وصف استجابات واجهة برمجة التطبيقات (API) باستخدام أسماء مستعارة للأنواع

TYPESCRIPT
type ApiResponse<T> = {
  status: number;
  message: string;
  data: T;
};

type User = {
  id: number;
  name: string;
  email: string;
};

type UserResponse = ApiResponse<User>;

let response: UserResponse = {
  status: 200,
  message: "Achieve Success",
  data: { id: 1, name: "Charlie", email: "xiao@example.com" }
};

console.log(`Status:${response.status}`);
console.log(`User:${response.data.name}`);
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
Status:200
User:Charlie


3. الأسماء المستعارة من النوع المتقاطع

يستخدم نوع «التقاطع» & لدمج أنواع متعددة في نوع واحد — ويتمتع النوع الجديد بجميع خصائص كل نوع من الأنواع الأصلية:

(1) قواعد النحو الأساسية

TYPESCRIPT
type Named = { name: string };
type Aged = { age: number };
type Person = Named & Aged;

let person: Person = {
  name: "Charlie",
  age: 20
  // Both must be present name and age
};

(2) التطبيقات العملية — المهارات المركبة

TYPESCRIPT
type HasId = { id: number };
type Timestamped = { createdAt: Date; updatedAt: Date };
type SoftDeletable = { deletedAt: Date | null };

type Entity = HasId & Timestamped & SoftDeletable;

let article: Entity = {
  id: 1,
  createdAt: new Date(),
  updatedAt: new Date(),
  deletedAt: null
};

(3) الصراع المتداخل

عندما يكون لدى نوعين خصائص تحمل الاسم نفسه ولكنهما من أنواع مختلفة، تكون نتيجة التقاطع هي never:

TYPESCRIPT
type A = { value: string };
type B = { value: number };
type C = A & B;

// C 's value The type is string & number = never
// No value can be both string and number
let c: C = { value: "" };  // ❌ You cannot string Assigned never


4. الأسماء المستعارة لأنواع المجموعات

TYPESCRIPT
type Point = [x: number, y: number];
type KeyValuePair = [key: string, value: number];
type RGB = [red: number, green: number, blue: number];

let coord: Point = [10, 20];
let entry: KeyValuePair = ["score", 95];
let color: RGB = [255, 128, 0];

// Deconstruction
let [x, y] = coord;
let [key, val] = entry;


5. أنواع القيم الثابتة في القوالب

قدمت TypeScript 4.1 أنواع القوالب الحرفية — وهي عملية ربط السلاسل على مستوى النوع:

(1) قواعد النحو الأساسية

TYPESCRIPT
type EventName = "click" | "focus" | "blur";
type EventHandler = `on${Capitalize<EventName>}`;
// Results:"onClick" | "onFocus" | "onBlur"

type CSSProperty = "margin" | "padding";
type CSSDirection = "top" | "right" | "bottom" | "left";
type CSSRule = `${CSSProperty}-${CSSDirection}`;
// Results:"margin-top" | "margin-right" | ... | "padding-left"

(2) أنواع العمليات المدمجة على السلاسل

النوع الوظيفة مثال
Uppercase<S> أحرف كبيرة Uppercase<"hello">"HELLO"
Lowercase<S> كلها أحرف صغيرة Lowercase<"HELLO">"hello"
Capitalize<S> تحويل الحرف الأول إلى كبير Capitalize<"hello">"Hello"
Uncapitalize<S> الحرف الأول صغير Uncapitalize<"Hello">"hello"

▶ مثال: نظام أحداث آمن من حيث الأنواع

TYPESCRIPT
type EventType = "click" | "change" | "submit";
type HandlerName = `on${Capitalize<EventType>}`;
// "onClick" | "onChange" | "onSubmit"

interface EventHandlers {
  onClick?: (x: number, y: number) => void;
  onChange?: (value: string) => void;
  onSubmit?: (data: FormData) => void;
}

// Usage——handler Type hints for names,I won't spell it wrong
let handlers: EventHandlers = {
  onClick: (x, y) => console.log(`Click:(${x}, ${y})`),
  onChange: (value) => console.log(`Value change:${value}`)
};
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
// Executed successfully


6. مقارنة شاملة بين الأنواع والواجهات

(1) مقارنة القدرات

القدرة النوع الواجهة
نوع الكائن type T = { ... } interface T { ... }
النوع المركب type T = A | B
من النوع المتقاطع type T = A & B استخدم extends بدلاً من ذلك
الأسماء المستعارة للأنواع الأساسية type T = string
نوع التوبول type T = [A, B]
القيمة الثابتة النموذجية type T = \...``
دمج الجمل
الفئة تُنفِّذ
يمتد يستخدم & extends
مفتاح الخاصية المحسوبة [K in Keys]

(2) اختر استراتيجية

TEXT 📖 للعرض فقط
Required Features              → Select
───────────────────────────────
Composite Types A | B          → type
Aliases for Basic Types            → type
Tuple [A, B]            → type
Template Literal Types          → type
Object Shape + Inheritance Required     → interface
Object Shape + Statement Merger     → interface
Simple Object Shapes          → Either is fine,As long as the team is on the same page, that's fine.

▶ مثال: أنواع القوالب الحرفية للمسارات الآمنة من حيث النوع

TYPESCRIPT
type Method = "GET" | "POST" | "PUT" | "DELETE";
type Resource = "users" | "posts" | "comments";
type ApiEndpoint = `${Method} /api/${Resource}`;

// Valid values: "GET /api/users", "POST /api/posts", etc.
let endpoint: ApiEndpoint = "GET /api/users";

// Invalid — caught at compile time
// endpoint = "PATCH /api/users";  // ❌ PATCH not in Method
// endpoint = "GET /api/orders";   // ❌ orders not in Resource

type EventName = "click" | "focus";
type HandlerName = `on${Capitalize<EventName>}`;
// "onClick" | "onFocus"

let handler: HandlerName = "onClick";
console.log(handler);
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
onClick


❓ أسئلة شائعة

س هل يمكن لـ type استخدام extends في عملية التوريث؟
ج لا تحتوي type على صيغة extends، ولكن يمكنك تحقيق تأثير مشابه باستخدام الأنواع المتقاطعة &type Child = Parent & { extra: string }. تعد صيغة extends في interface أكثر وضوحًا ويمكنها اكتشاف التعارضات؛ وعندما يتعارض الأنواع المتقاطعة، يتم إنشاء never بدلاً من ظهور خطأ (يصبح النوع ببساطة غير متاح).
س هل يمكن لـ type أن يُنفَّذ بواسطة class؟
ج نعم. طالما أن type يُعرِّف نوع كائن (باستثناء الاتحادات والأنواع الأولية وما إلى ذلك)، فيمكن لـ class تنفيذه. class User implements UserType { ... } صحيح تمامًا.
س متى يجب استخدام type بدلاً من interface؟
ج هناك ثلاث حالات: (1) أنواع الاتحاد — لا يمكن لـ interface التعبير عن A | B؛ (2) أنواع التوبلات — على الرغم من أنه يمكنك استخدام interface، إلا أن ذلك غير ملائم على الإطلاق؛ (3) أنواع القوالب الحرفية — interface لا يدعمها. في جميع الحالات الأخرى، يكون الاثنان متكافئين، ويمكنك استخدام أي منهما.
س ما هي الاستخدامات العملية لأنواع القوالب الحرفية؟
ج تُستخدم في المقام الأول في البرمجة المتقدمة للأنواع — مثل الإنشاء التلقائي لأسماء الأحداث (onClick/onFocus)، ودمج خصائص CSS (margin-top)، واستنتاج أنواع مسارات التوجيه. وهي لا تُستخدم عادةً في أعمال التطوير اليومية، لكنها تتمتع بقوة كبيرة في تعريف الأنواع للأطر والمكتبات. ويكفي أن يكون المبتدئون على دراية بوجودها.

📖 ملخص

📝 تمارين

  1. المشكلة الأساسية (الصعوبة ⭐): عرّف StatusCode = 200 | 404 | 500 باستخدام type، ثم عرّف ApiResponse<T> = { code: StatusCode; data: T }. أنشئ مثيلًا لـ ApiResponse<string> واطبعه.
  2. مشكلة متقدمة (درجة الصعوبة ⭐⭐): استخدم التوليفات من النوع المتقاطع HasId وHasTimestamps وHasAudit لتعريف نوع Entity كامل. أنشئ كائنًا مثيلًا وتأكد من استيفاء جميع الخصائص.
  3. التحدي (الصعوبة: ⭐⭐⭐): عرّف CSSDirection = "top" | "right" | "bottom" | "left" باستخدام نوع القالب الحرفي، ثم قم بإنشاء MarginStyle = { [K in margin-${CSSDirection}]: number }. تأكد من أن النوع الذي تم إنشاؤه يتضمن خصائص مثل marginTop و marginRight.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%