الأنواع كلغة للحساب
افهموا نظام الأنواع بوصفه لغة وظيفية نقية
الأنواع كلغة للحساب درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
الأنواع لغة
يحتوي TypeScript على لغتين تعيشان جنباً إلى جنب. إحداهما هي JavaScript على مستوى القيم، التي تعرفها بالفعل. والأخرى هي مستوى الأنواع، الذي يعمل بالكامل أثناء الترجمة. وفي هذه الدورة تتعلم كيف تبرمج بهذه اللغة الثانية.
إن نظام الأنواع لغة صغيرة ونقية ووظيفية. تقدّم له الأنواع كمدخلات، فيحسب الأنواع كمخرجات. ولا يبقى أي جزء منه أثناء التشغيل.
type Greeting = "hello";
type Loud = Uppercase<Greeting>;
// Loud is "HELLO" - computed by the type systemأنواع داخلة، وأنواع خارجة
النوع العام هو في الأساس دالة من أنواع إلى أنواع. فمعامل النوع هو الوسيط، وجسم النوع هو قيمة الإعادة.
في المثال التالي، يأخذ Boxed نوعاً هو T وينتج نوع كائن يغلّفه. فكّر في T باعتباره معاملاً تمرّره.
type Boxed<T> = { value: T };
type A = Boxed<number>; // { value: number }
type B = Boxed<string>; // { value: string }الأنواع العامة دوال
قارن بين دالة على مستوى القيم وأخرى على مستوى الأنواع. فالبنيتان متطابقتان تقريباً: وسائط داخلة، ونتيجة واحدة خارجة.
- القيمة:
const id = (x) => x - النوع:
type Id<T> = T
يعيد Id على مستوى الأنواع ببساطة كل ما تقدّمه إليه.
type Id<T> = T;
type X = Id<boolean>; // boolean
type Y = Id<"abc">; // "abc"لا تكلفة أثناء التشغيل
كل ما يوجد على مستوى الأنواع يُمحى قبل تشغيل الشفرة. ولا يحتوي ناتج JavaScript على أي أثر لحسابات الأنواع. ولا توجد تكلفة أداء في البرنامج قيد التشغيل، مهما كانت أنواعك معقدة.
ولهذا تُسمّى البرمجة على مستوى الأنواع أحياناً مجانية: فهي تؤثر في المترجم فقط، ولا تؤثر أبداً في الحزمة.
type Pair<T> = [T, T];
const p: Pair<number> = [1, 2];
// Compiled JS is just: const p = [1, 2];
console.log(p);معاملات متعددة
يمكن للدوال على مستوى الأنواع أن تتلقى عدة معاملات، تماماً مثل الدوال العادية. يأخذ Merge هنا نوعَي كائن ويجمع بينهما.
اقرأ ذلك على النحو التالي: عند إعطاء A وB، أعد كائناً يحتوي على جميع خصائص كليهما.
type Merge<A, B> = A & B;
type User = { id: number };
type Named = { name: string };
type NamedUser = Merge<User, Named>;
// { id: number; name: string }القيم الافتراضية للمعلمات
يمكن أن تكون لمعلمات الأنواع قيم افتراضية، تمامًا مثل وسائط الدوال الافتراضية. إذا حذف المستدعي الوسيط، تُستخدم القيمة الافتراضية.
type List<T = string> = T[];
type A = List; // string[]
type B = List<number>; // number[]القيود تعمل كحواجز
يقيّد القيد باستخدام extends الأنواع التي يمكن تمريرها. وهو المكافئ على مستوى الأنواع للتحقق من وسيط الدالة قبل استخدامه.
لا يقبل HasId إلا الأنواع التي تحتوي مسبقًا على الخاصية id، ولذلك يمكن لجسمه قراءتها بأمان.
type GetId<T extends { id: number }> = T["id"];
type A = GetId<{ id: number; name: string }>; // number
// GetId<{ name: string }> would be a compile errorالحساب لا مجرد التوسيم
يستخدم المبتدئون الأنواع فقط لتوسيم القيم. أما البرمجة على مستوى الأنواع فتستخدم الأنواع لحساب النتائج. فالأداة المضمّنة ReturnType، مثلًا، تفحص نوع الدالة وتستخرج نوع النتيجة منها.
type Fn = (a: number) => string;
type R = ReturnType<Fn>; // string
type Fn2 = () => boolean;
type R2 = ReturnType<Fn2>; // booleanالتعيين على الخصائص
تتيح لك الأنواع المُعيَّنة تحويل كل خاصية في نوع كائن. هذه حلقة في لغة الأنواع. يحوّل Stringify كل نوع قيمة إلى string.
type Stringify<T> = { [K in keyof T]: string };
type Input = { a: number; b: boolean };
type Out = Stringify<Input>; // { a: string; b: string }نقية وحتمية
لغة الأنواع نقية: تنتج المدخلات نفسها دائمًا نوع المخرجات نفسه، من دون آثار جانبية. لا توجد طفرات، ولا عمليات IO، ولا اعتماد على الوقت. وهذه النقاوة هي ما يجعل البرامج على مستوى الأنواع قابلة للتنبؤ وقابلة للتركيب.
وبفضل النقاوة، تستدل على الأنواع بالطريقة التي تستدل بها على الرياضيات: بالتعويض.
type Square<T extends { area: number }> = T["area"];
// Always the same result for the same input shapeلماذا يهم ذلك
يتيح لك إتقان هذه اللغة الثانية ترميز قواعد يفرضها المترجم مجانًا: المسارات الصحيحة، وعبارات التبديل الشاملة، والمعالجة الآمنة للسلاسل النصية، وواجهات برمجة لا يمكن إساءة استخدامها. وتبني بقية هذه الدورة مجموعة الأدوات اللازمة لذلك.
الفكرة الأساسية: النوع قيمة في لغة الأنواع، والنوع العام دالة.
type NonEmpty<T extends unknown[]> =
T extends [unknown, ...unknown[]] ? T : never;
// Encodes a rule: the tuple must have at least one elementاختبار سريع
اختبر فهمك للأنواع بوصفها لغة للحساب.
مراجعة
تعلمت أن أنواع TypeScript تكوّن لغة وظيفية نقية تعمل في وقت الترجمة.
- الأنواع العامة دوال: تدخل إليها الأنواع وتخرج منها الأنواع.
- تدعم المعلمات القيم الافتراضية والقيود باستخدام
extends. - تكرّر الأنواع المُعيَّنة على الخصائص.
- تُمحى جميع هذه العناصر، ولذلك لا توجد تكلفة في وقت التشغيل.
التالي: ستضيف إلى هذه اللغة عبارة if: الأنواع الشرطية.
الأسئلة الشائعة
هل درس «الأنواع كلغة للحساب» مجاني؟
نعم — نص درس «الأنواع كلغة للحساب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأنواع كلغة للحساب»؟
افهموا نظام الأنواع بوصفه لغة وظيفية نقية تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الأنواع كلغة للحساب»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأنواع كلغة للحساب
- الشروط على مستوى النوع
- التكرار على مستوى النوع
- الأنواع الشرطية التوزيعية