Menu
flag Ar iconالعربيةdown icon

Type Alias في TypeScript: الكلمة المفتاحية type مع أمثلة

يعطي type alias اسمًا لأي نوع باستخدام الكلمة المفتاحية type: أشكال الكائنات، وunion، وtuples، والدوال، والأنواع العامة، والأنواع التعاودية. تعرّف على الصياغة، وشكل كل صيغة، ولماذا الاسم المستعار مجرد اسم وليس نوعًا جديدًا منفصلًا.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

يعطي type alias اسمًا لنوع. تكتب type Name = ...، ومن ثم يمكن استخدام Name في أي مكان يُتوقع فيه نوع. وعلى خلاف interface، يستطيع الاسم المستعار تسمية أي نوع على الإطلاق، لا أشكال الكائنات فقط.

الأسماء المستعارة موجودة وقت الترجمة فقط. لا يحتوي كود JavaScript الناتج على أي من أسطر type هذه.

الصياغة

type Name = SomeType;
type Name<T> = SomeTypeUsing<T>;       // generic
export type Name = SomeType;           // exported from a module

الأسماء بصيغة PascalCase عرفًا. والجانب الأيمن من علامة = أي تعبير نوع، ويمكن للاسم المستعار استخدام أسماء مستعارة أخرى، ومنها نفسه (انظر الأنواع التعاودية أدناه). الاسم المستعار متاح في النطاق كله الذي عُرّف فيه، حتى قبل سطر التعريف، لأن الأنواع تُفحص وقت الترجمة ولا تُنفذ بالترتيب مثل const أو let.

أنواع الكائنات

لشكل كائن، يُكتب الاسم المستعار والواجهة بالطريقة نفسها تقريبًا. يستخدم الاسم المستعار = وينتهي عادة بفاصلة منقوطة.

لا يستطيع الاسم المستعار استخدام extends؛ ويؤدي intersection بالرمز & هذا الدور. وفحص الخصائص الزائدة والخصائص الاختيارية وreadonly تعمل تمامًا كما في الواجهات. أما أيهما تختار لأشكال الكائنات فمشروح في صفحة interface مقابل type.

Union وTuples والدوال

هذه هي الحالات التي لا يسميها إلا الاسم المستعار، والسبب الرئيسي لوجود type. يسرد الاسم المستعار لـ union البدائل، ويثبّت الاسم المستعار لـ tuple طول المصفوفة وأنواع عناصرها، ويصف الاسم المستعار للدالة توقيعًا.

في scale لا تحتاج المعاملات إلى تعليقات أنواع: يوفر الاسم المستعار Transform أنواعها. صياغة tuple مشروحة في tuples، وتضييق union في صفحة أنواع union.

Type Aliases العامة

تجعل معاملات الأنواع اسمًا مستعارًا واحدًا يعمل مع أنواع كثيرة. ويمكن أن تكون لها قيم افتراضية، تمامًا مثل معاملات الدوال.

يستخدم Result<number> القيمة الافتراضية E = string. والأسماء المستعارة العامة الصغيرة مثل type Nullable<T> = T | null أو type Dict<T> = Record<string, T> شائعة في الكود الحقيقي. وأنواع الأدوات المدمجة (Partial<T> وPick<T, K> وReturnType<F>) أسماء مستعارة عامة أيضًا، معرّفة في المكتبة المعيارية.

الأسماء المستعارة أسماء لا أنواع جديدة

لا ينشئ الاسم المستعار نوعًا مميزًا. إنه اسم ثانٍ للنوع في الجانب الأيمن، ويعامل المترجم الاثنين على أنهما متطابقان. اسمان مستعاران لـ string قابلان للاستبدال تمامًا:

يطبع هذا cancelling u_42 دون أي خطأ، وهذا هو الخطأ الذي لا يستطيع الاسم المستعار منعه. ما زال الاسم المستعار يساعد القراء (المعامل الذي نوعه OrderId يقول أكثر من string)، لكن إذا كان يجب أن يكون الخلط بين معرّفين خطأ ترجمة، فاستخدم branded type مثل string & { readonly __brand: "OrderId" }.

Type Aliases التعاودية

يمكن للاسم المستعار أن يشير إلى نفسه، وهكذا تصف الأشجار والقوائم المتداخلة وJSON:

يرفض الاسم المستعار Json القيم التي لا يستطيع JSON تمثيلها: إسناد { when: new Date() } أو { f: undefined } إلى Json خطأ ترجمة (TS2322).

أنواع من القيم: typeof

عندما تكون القيمة موجودة أصلًا، يمكنك تسمية نوعها بدل كتابته. يقرأ عامل الأنواع typeof نوع متغير، ويتركب مع عوامل أخرى:

const defaults = { retries: 3, verbose: false, level: "info" };

type Options = typeof defaults;
// { retries: number; verbose: boolean; level: string }

type OptionKey = keyof typeof defaults;
// "retries" | "verbose" | "level"

function start(port: number) {
  return { port, startedAt: new Date() };
}
type Server = ReturnType<typeof start>;
// { port: number; startedAt: Date }

تبقى القيمة مصدر الحقيقة الوحيد: أضف خاصية إلى defaults فيتبعها Options. المزيد في typeof.

تصدير الأسماء المستعارة واستيرادها

تُصدَّر الأسماء المستعارة وتُستورد مثل القيم. يوضّح import type أن المستورد نوع فقط، فيُحذف الاستيراد دائمًا من ناتج JavaScript:

// shapes.ts
export type Point = { x: number; y: number };
export type Shape = { kind: "circle"; center: Point; radius: number };

// main.ts
import type { Point, Shape } from "./shapes.js";

const p: Point = { x: 1, y: 2 };

الأسئلة الشائعة

ما هو type alias في TypeScript؟

type alias اسم لنوع، يُعرَّف بالكلمة المفتاحية type: type Point = { x: number; y: number }. بعد ذلك يمكن استخدام Point في أي مكان يُتوقع فيه نوع. ويمكنه تسمية أي نوع: شكل كائن، أو union، أو tuple، أو توقيع دالة، أو نوع بدائي، أو نوع عام.

هل ينشئ type alias نوعًا جديدًا؟

لا. الاسم المستعار مجرد اسم آخر لنوع موجود. مع type UserId = string وtype OrderId = string يمكن تمرير UserId حيث يُتوقع OrderId، لأن كليهما مجرد string. لصنع أنواع لا يمكن استبدال أحدها بالآخر، استخدم branded type.

هل يمكن لـ type alias أن يشير إلى نفسه؟

نعم، ما دامت الإشارة الذاتية متداخلة داخل نوع كائن أو مصفوفة أو tuple: type TreeNode = { value: number; children: TreeNode[] } واسم مستعار Json يتضمن Json[] كلاهما يعمل. أما الإشارة المجردة مثل type Loop = Loop | string فهي الخطأ TS2456، Type alias 'Loop' circularly references itself.

هل يمكن أن يكون type alias عامًا (generic)؟

نعم. ضع معاملات الأنواع بعد الاسم: type Box<T> = { value: T }، ثم استخدمه كـ Box<number>. ويمكن أن يكون للمعاملات قيم افتراضية (type Result<T, E = string> = ...) وقيود (type Keys<T extends object> = keyof T).

كيف أحصل على نوع من كائن موجود؟

استخدم عامل الأنواع typeof: const defaults = { retries: 3, verbose: false }; type Options = typeof defaults; يعطي { retries: number; verbose: boolean }. هذا يحافظ على مصدر حقيقة واحد عندما تأتي القيمة أولًا.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن