TypeScript: الأنواع الأساسية في TypeScript
آخر تحديث: 2026-08-26
يبدأ نظام الأنواع في TypeScript بسبعة أنواع أساسية — إذا أتقنت هذه الأنواع، فستكون قد أتقنت «الأبجدية» الخاصة بتعليقات الأنواع.
1. سبعة أنواع أساسية
يرث TypeScript الأنواع السبعة الأساسية من JavaScript ويوفر صيغة لتعليق الأنواع لكل نوع:
| النوع | الوصف | مثال على القيمة |
|---|---|---|
string |
سلسلة | "hello"، 'world'، `template` |
number |
الأعداد (الأعداد الصحيحة والأعداد العشرية) | 42، 3.14، 0xFF |
boolean |
قيمة منطقية | true، false |
null |
قيمة فارغة | null |
undefined |
غير محدد | undefined |
symbol |
المعرّف الفريد | Symbol("id") |
bigint |
عدد صحيح كبير | 100n، BigInt(9007199254740991) |
(1) سلسلة
يمكن كتابة السلاسل باستخدام علامات الاقتباس المفردة أو المزدوجة أو علامات الاقتباس المائلة العكسية (سلاسل القوالب):
let firstName: string = "Charlie";
let lastName: string = 'Wang';
let greeting: string = `Hello, ${firstName} ${lastName}`;
تدعم سلاسل القوالب (العلامات المائلة العكسية) المتغيرات والتعبيرات المضمنة؛ وقد أُدرجت هذه الصيغة في ES6، وهي مدعومة بالكامل في TypeScript.
(2) الرقم
مثل لغة JavaScript، لا تميز لغة TypeScript بين الأعداد الصحيحة والأعداد العائمة — فكلاهما من النوع number:
let age: number = 25; // Integer
let price: number = 9.99; // Decimals
let hex: number = 0xFF; // Hexadecimal
let binary: number = 0b1010; // Binary
let octal: number = 0o744; // Octal
Number.MAX_SAFE_INTEGER (2^53 - 1)، فيجب عليك استخدام bigint بدلاً من number؛ وإلا فستفقد الدقة.
(3) منطقية
لا يوجد سوى قيمتين: true وfalse. وتُستخدم هاتان القيمتان عادةً في عمليات الفحص الشرطي وكعلامات تبديل:
let isActive: boolean = true;
let hasPermission: boolean = false;
▶ مثال: تعليقات الأنواع الأولية
// Defining Different Types of Variables
let title: string = "TypeScript Getting Started";
let version: number = 5.3;
let isPublished: boolean = true;
console.log("Courses:" + title);
console.log("Version:" + version);
console.log("Published:" + isPublished);
الناتج:
Courses:TypeScript Getting Started
Version:5.3
Published:true
2. فارغ و غير معرّف
في TypeScript، يُعتبر كل من null وundefined قيمتين وأنواعًا في آن واحد. وقد يبدو الفرق بينهما طفيفًا، لكنه مهم في نظام الأنواع.
(1) الاختلافات في المعنى
| النوع | المعنى | متى تظهر |
|---|---|---|
undefined |
"لم يتم تعيينها بعد" | تم إعلان المتغير ولكن لم يتم تهيئته؛ الدالة لا تحتوي على قيمة إرجاع |
null |
"ترك فارغًا عمدًا" | تم تعيينه من قِبل المطور للإشارة إلى "لا توجد قيمة هنا" |
(2) تعليقات الأنواع
let notAssigned: undefined = undefined;
let emptyValue: null = null;
null وundefined إلى متغيرات من أي نوع (على سبيل المثال، let name: string = null صالحة). ومع ذلك، بمجرد تمكين strictNullChecks، لا يمكن تعيينهما إلا إلى أنواع من نوع null/undefined أو أنواع الاتحاد. يُنصح بشدة بتمكين الفحص الصارم للقيم الفارغة.
(3) تأثير strictNullChecks
// strictNullChecks: false(Default Relaxed Mode)
let name: string = null; // ✅ No errors,But at runtime name.toUpperCase() It will crash
// strictNullChecks: true(Strict Mode,Recommendations)
let name2: string = null; // ❌ Error:You cannot null Assign to string
let name3: string | null = null; // ✅ Correct:An explicit declaration might be null
strict: true تشمل strictNullChecks: true. في الوضع الصارم، يجب الإعلان صراحةً عن أي قيمة يمكن أن تكون null أو undefined؛ وهذا يمنع 90% من أخطاء وقت التشغيل من نوع «غير معرّف is not a دالة».
3. النوع symbol
symbol هو نوع بدائي تم إدخاله في ES6 ويُستخدم لإنشاء معرّفات فريدة على المستوى العام. كل استدعاء لـ Symbol() يُنتج قيمة فريدة:
let id1: symbol = Symbol("id");
let id2: symbol = Symbol("id");
console.log(id1 === id2); // false —— Even if the descriptions are the same,Each symbol They are all unique.
▶ مثال: استخدام رمز كمفتاح فريد لكائن
let uniqueKey: symbol = Symbol("secret");
let user = {
name: "Diana",
age: 20
};
// Use symbol as a property key,Does not conflict with other attributes
user[uniqueKey] = "Hide Data";
console.log(user.name); // Normal Access
console.log(user[uniqueKey]); // Visit symbol Key value
الناتج:
Diana
Hide Data
Symbol.iterator وعمليات تنفيذ الأطر الداخلية). وبالنسبة للمبتدئين، يكفي أن يفهموا أن «Symbol() تُنشئ قيمة فريدة في كل مرة يتم استدعاؤها».
4. النوع bigint
bigint هو نوع تم إدخاله في ES2020 لتمثيل الأعداد الصحيحة الكبيرة التي تتجاوز النطاق الآمن لـ number. أي عدد يتبعه n يُعتبر bigint:
let big1: bigint = 100n; // Literal Notation
let big2: bigint = BigInt(9007199254740991); // Function Syntax
// number Upper Limit for Secure Integers
let maxSafe: number = Number.MAX_SAFE_INTEGER; // 9007199254740991
let overflow: number = 9007199254740992; // Outside the safety range,Loss of Accuracy!
// bigint No loss of precision
let safe: bigint = 9007199254740992n; // Precise representation
bigint وnumber معًا في الحسابات — سيؤدي استخدام 100n + 50 إلى حدوث خطأ. يجب عليك أولاً توحيد النوع إلى Number(100n) + 50 أو 100n + BigInt(50).
▶ مثال: مقارنة دقة عدد «bigint»
// number Accuracy is lost when the safe range is exceeded
let a: number = 9007199254740992;
let b: number = 9007199254740993;
console.log(a === b); // true!Two different numbers are actually equal
// bigint Precise representation
let c: bigint = 9007199254740992n;
let d: bigint = 9007199254740993n;
console.log(c === d); // false —— Distinguish Correctly
الناتج:
true
false
5. حذف تعليقات الأنواع وأفضل الممارسات
(1) متى يكون من الضروري تضمين تعليق النوع؟
| السيناريو | هل هو مطلوب؟ | السبب |
|---|---|---|
| المتغيرات التي لا تحتوي على قيم أولية | ✅ إلزامي | وإلا، فلن يتمكن TypeScript من استنتاج النوع |
| معلمة الدالة | ✅ إلزامية | لا توجد قيمة أولية لهذه المعلمة لأغراض الاستدلال |
| قيمة إرجاع الدالة | ⚠️ موصى به | يمكن لـ TypeScript استنتاج ذلك، لكن التوضيح الصريح يوفر مزيدًا من الوضوح |
| المتغير له قيمة أولية | ❌ اختياري | يقوم TypeScript باستنتاج النوع بناءً على القيمة الأولية |
(2) أفضل الممارسات
// ✅ Recommendations:Omit the type annotation when a variable has an initial value(Type inference is sufficient)
let name = "Charlie";
let age = 20;
// ✅ Recommendations:Explicitly Labeling Function Parameters and Return Values
function greet(name: string): string {
return "Hello, " + name;
}
// ✅ Recommendations:Explicitly label when there is no initial value
let userId: number;
let isActive: boolean;
// ❌ Not recommended:Why include annotations when there are initial values?(Redundancy)
let name2: string = "Charlie"; // Superfluous——TypeScript It has already been deduced.
❓ أسئلة شائعة
null وundefined؟ ومتى ينبغي استخدام كل منهما؟undefined إلى «لم يتم تعيينها بعد» (حالة يُنشئها النظام تلقائيًا)، بينما تشير null إلى «فارغة عمدًا» (قيمة يحددها المطور صراحةً). في عملية التطوير الفعلية، يُنصح باستخدام null للإشارة إلى «لا توجد قيمة» — لأن undefined قد ينتج عن نسيان تعيين قيمة، في حين أن null يمثل اختيارًا متعمدًا.bigint بشكل شائع؟number (الذي يوفر نطاقًا آمنًا للأعداد الصحيحة يصل إلى 2^53-1 ≈ 900 تريليون). يُستخدم bigint بشكل أساسي في سيناريوهات مثل خوارزميات التشفير، وحسابات الأعداد الكبيرة، وحقول bigint في قواعد البيانات. يكفي أن يدرك المبتدئون وجوده؛ ويمكنهم التعمق في الموضوع عندما يحتاجون فعليًا إلى استخدامه.📖 ملخص
- يحتوي TypeScript على سبعة أنواع أساسية: سلسلة، و number، و منطقي، و فارغ، و غير معرّف، و symbol، و bigint
- لا يميز النوع
numberبين الأعداد الصحيحة والأعداد العشرية؛ أما النوعbigintفيُستخدم للأعداد الصحيحة الكبيرة جدًّا ولا يمكن استخدامه في العمليات المختلطة مع النوعnumber. - في الوضع الصارم، لا يمكن تعيين
nullأوundefinedبشكل تعسفي إلى أنواع أخرى؛ بل يجب استخدام نوع الاتحاد (string | null). - الرمز: يُنشئ معرّفًا فريدًا على مستوى النظام، ويُستخدم بشكل أساسي في السيناريوهات المتقدمة
- يمكن الاستغناء عن توضيحات النوع عندما يكون للمتغيرات قيم أولية (استنتاج النوع)؛ أما معلمات الدوال والمتغيرات التي لا تحتوي على قيم أولية فيجب توضيح نوعها.
📝 تمارين
- المسألة الأساسية (الصعوبة ⭐): قم بتعريف خمسة متغيرات تتوافق مع خمسة أنواع شائعة (سلسلة، عدد، منطقية، فارغ، غير معرّف)، وقم بتعيين القيم المناسبة لها، واستخدم
console.logلعرضها واحدة تلو الأخرى. - مشكلة متقدمة (درجة الصعوبة ⭐⭐): اكتب دالة
formatPrice(price: number, currency: string): stringتقوم بتنسيق سعر رقمي ليصبح سلسلة نصية تحتوي على رمز العملة. على سبيل المثال، تُرجع الدالةformatPrice(99.5, "¥")القيمة"¥99.5". - مشكلة التحدي (الصعوبة ⭐⭐⭐): تحقق من دقة
number— اكتب كودًا لمقارنة ما إذا كان0.1 + 0.2و0.3متساويين، وشرح النتيجة. ثم استخدمbigintلحساب مجموع عددين صحيحين كبيرين يتجاوزانNumber.MAX_SAFE_INTEGER، وتأكد من أنbigintلا يفقد دقته.