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)، واستنتاج أنواع مسارات التوجيه. وهي لا تُستخدم عادةً في أعمال التطوير اليومية، لكنها تتمتع بقوة كبيرة في تعريف الأنواع للأطر والمكتبات. ويكفي أن يكون المبتدئون على دراية بوجودها.
📖 ملخص
- النوع: يعيّن اسمًا مستعارًا لنوع موجود؛ ولا ينشئ نوعًا جديدًا؛ الصيغة:
type Name = type - تُعد الأسماء المستعارة لأنواع الاتحاد الاستخدام الأكثر شيوعًا لـ
type— فهي تجعل أنواع الاتحاد المعقدة سهلة القراءة وقابلة لإعادة الاستخدام. - النوع المتقاطع
A & Bيجمع بين جميع خصائص أنواع متعددة؛ وفي حالة وجود تعارض، تكون النتيجة «أبدًا» - تقوم أنواع القوالب الحرفية بربط السلاسل على مستوى النوع، بالاقتران مع العمليات المدمجة (مثل تحويل الأحرف إلى كبيرة)
typeوinterfaceمتكافئان في معظم الحالات؛ أما أنواع الاتحاد، والمجموعات، والقيم الثابتة القوالب فيجب أن تستخدمtype
📝 تمارين
- المشكلة الأساسية (الصعوبة ⭐): عرّف
StatusCode = 200 | 404 | 500باستخدامtype، ثم عرّفApiResponse<T> = { code: StatusCode; data: T }. أنشئ مثيلًا لـApiResponse<string>واطبعه. - مشكلة متقدمة (درجة الصعوبة ⭐⭐): استخدم التوليفات من النوع المتقاطع
HasIdوHasTimestampsوHasAuditلتعريف نوعEntityكامل. أنشئ كائنًا مثيلًا وتأكد من استيفاء جميع الخصائص. - التحدي (الصعوبة: ⭐⭐⭐): عرّف
CSSDirection = "top" | "right" | "bottom" | "left"باستخدام نوع القالب الحرفي، ثم قم بإنشاءMarginStyle = { [K inmargin-${CSSDirection}]: number }. تأكد من أن النوع الذي تم إنشاؤه يتضمن خصائص مثل marginTop و marginRight.