السبت - الخميس: 10:00 ص - 10:00 م

تعلم TypeScript للمبتدئين: دليل شامل لفهم TypeScript والفرق بينها وبين JavaScript

دليل شامل لتعلم TypeScript من الصفر. يشرح الفرق بين JavaScript وTypeScript، المفاهيم الأساسية مثل Types, Interfaces, Generics، وكيفية حل أخطاء TypeScript.

تعلم TypeScript للمبتدئين: دليل شامل لفهم TypeScript والفرق بينها وبين JavaScript

تعلم TypeScript للمبتدئين: دليل شامل لفهم TypeScript والفرق بينها وبين JavaScript

لو أنت بدأت JavaScript وبدأت تشوف TypeScript في المشاريع الحديثة أو طلبات التوظيف، غالبًا هتقابل مصطلحات زي Type Annotation و Interface و Union Type و Generic، وممكن تسأل: هو TypeScript أصلًا إيه؟ وهل لازم أتعلمها؟ وهل هبدأ من الصفر تاني؟

الخبر السعيد هو إنك مش هتبدأ من الصفر. TypeScript مبنية بالأساس على JavaScript، لكنها بتضيف "نظام أنواع" (Type System) صارم بيساعدك تكتشف الأخطاء قبل ما تشغل الكود، وده بيوفر ساعات من الـ Debugging.

في المقال ده، هناخدك من أول يعني إيه TypeScript والفرق بينها وبين JS، لحد ما تفهم المفاهيم الأساسية، الأخطاء الشائعة، وإزاي تطبقها في مشروع عملي.

⚡ الإجابة السريعة: يعني إيه TypeScript؟

TypeScript هي لغة برمجة (Superset من JavaScript) تم تطويرها بواسطة Microsoft. تضيف Static Typing (تحديد نوع البيانات) وميزات متقدمة لـ JavaScript لتسهيل اكتشاف الأخطاء أثناء كتابة الكود. لا يمكن تشغيلها مباشرة في المتصفح، بل يتم تحويلها (Compiled) إلى كود JavaScript عادي.

1. يعني إيه TypeScript؟

ما هي TypeScript؟

TypeScript هي لغة برمجة مفتوحة المصدر طورتها Microsoft، تُعد "Superset" (مجموعة فائقة) من JavaScript. هذا يعني أن أي كود JavaScript صحيح هو كود TypeScript صحيح، لكن TypeScript تضيف ميزات إضافية أهمها Static Typing (الأنواع الثابتة) لاكتشاف الأخطاء قبل التشغيل.

لماذا ظهرت TypeScript؟

JavaScript لغة Dynamic مرنة جدًا، وده بيخلي كتابة الكود سريعة، لكن في المشاريع الكبيرة المرونة دي بتسبب أخطاء خفية (مثلاً تبعت رقم لـ Function متوقعة نص). TypeScript ظهرت عشان تحل المشكلة دي عن طريق إجبار المطور يحدد أنواع البيانات (Types)، فلو حصل خطأ، الـ Editor ينبهك فورًا.

مثال بسيط

// في JavaScript
let username = "Ahmed";
username = 25; // عادي، مش هيطلع خطأ هنا، بس ممكن يضرب بعدين!

// في TypeScript
let username: string = "Ahmed";
// username = 25; // ❌ Error: Type 'number' is not assignable to type 'string'.

هنا TypeScript وقفتك وقالتلك: "أنت قولت إن المتغير ده نص (string)، إزاي بتحط فيه رقم؟". ده بيحميك من أخطاء كتير جداً في الـ Production.

2. الفرق بين JavaScript وTypeScript

ما الفرق بين JavaScript وTypeScript؟

الفرق الأساسي هو الـ Type System. JavaScript هي Dynamic Typing (تتحدد الأنواع وقت التشغيل)، بينما TypeScript هي Static Typing (تُحدد وتُفحص الأنواع وقت كتابة الكود). TypeScript تحتاج لعملية Compilation لتحويلها إلى JS، بينما JS تعمل مباشرة.

جدول مقارنة شامل

المعيارJavaScript (.js)TypeScript (.ts)
Type SystemDynamic (وقت التشغيل)Static (وقت التطوير)
اكتشاف الأخطاءأثناء التشغيل (Runtime)أثناء الكتابة (Compile-time)
الـ Compilationتعمل مباشرة في المتصفح/Nodeتُحوّل (Transpiled) إلى JavaScript
منحنى التعلم (Learning Curve)أسهل وأسرع في البدايةيحتاج فهم Types وInterfaces
المشاريع الصغيرة/الـ Prototypes✅ ممتازة وسريعة⚠️ قد تكون Overkill (إعداداتها تأخذ وقت)
المشاريع الكبيرة/الشركات⚠️ صعبة الصيانة✅ ممتازة جدًا وتُفضل بقوة

3. هل TypeScript أفضل من JavaScript؟

هل TypeScript أفضل من JavaScript دائمًا؟

لا يوجد اختيار أفضل في كل الحالات؛ الاختيار يعتمد على حجم المشروع واحتياجاته. TypeScript ممتازة للمشاريع الكبيرة وفرق العمل، لكن JavaScript قد تكون أسرع وأنسب للسكريبتات البسيطة والمشاريع الصغيرة جدًا.

متى تكون TypeScript مفيدة جدًا؟

  • المشاريع الكبيرة (Enterprise): الكود بيكون ضخم ومحتاج تنظيم.
  • فرق العمل (Teams): الـ Types بتعمل كـ Documentation للكود فالمطورين يفهموا بعض بسهولة.
  • استخدام Frameworks حديثة: Angular مبنية بـ TypeScript، وReact وNext.js بيدعموها بشكل ممتاز.

متى تكون JavaScript كافية؟

  • مشاريع صغيرة جداً أو Prototypes: محتاج تنجز بسرعة بدون إعدادات (Config).
  • سكربتات سريعة: كود من 50-100 سطر لتنفيذ مهمة واحدة.
  • في بداية التعلم: الأفضل تفهم JS الأول قبل ما تتعقد بـ Types.

4. إزاي أثبت TypeScript؟

كيف أقوم بتثبيت TypeScript؟

يتم تثبيت TypeScript باستخدام npm (مدير حزم Node.js). يجب أولاً التأكد من تثبيت Node.js، ثم كتابة الأمر npm install -g typescript في الـ Terminal لتثبيتها على مستوى النظام بالكامل.

الخطوات العملية

الخطوة 1: التأكد من Node.js
افتح الـ Terminal (أو CMD) واكتب:

node -v

لو طلعلك رقم إصدار، كمل. لو لأ، نزل Node.js من الموقع الرسمي.

الخطوة 2: تثبيت TypeScript
لتثبيتها Global (على جهازك كله):

npm install -g typescript

أو كـ Local Dependency (مفضلة في المشاريع، عشان كل مشروع يستخدم النسخة بتاعته):

npm install --save-dev typescript

الخطوة 3: التحقق من التثبيت

tsc -v

الأمر tsc هو اختصار لـ TypeScript Compiler، وده اللي بيحوّل الكود لـ JavaScript.

5. يعني إيه Type Annotation؟

ما هو Type Annotation في TypeScript؟

Type Annotation هي طريقة لإخبار TypeScript صراحةً بنوع البيانات الذي سيحمله المتغير. تُكتب باستخدام نقطتين فوق بعض : متبوعة بنوع البيانات (مثل : string أو : number).

أمثلة أساسية

// صيغة: let variableName: type = value;

let firstName: string = "Ahmed";
let age: number = 30;
let isDeveloper: boolean = true;
let skills: string[] = ["HTML", "CSS", "JS"]; // Array of strings

Type Inference (الاستنتاج الذكي)

مش لازم دايماً تكتب الـ Type بإيدك. TypeScript ذكية كفاية إنها تستنتج النوع من القيمة:

let country = "Egypt"; // TS فهمت فورًا إنها string
// country = 20; // ❌ Error

💡 نصيحة: استخدم Type Inference مع القيم البسيطة الواضحة، واستخدم Type Annotation لما تعرف متغير بدون قيمة أو مع الـ Functions والـ Objects المعقدة.

6. الفرق بين type و interface

ما الفرق بين type و interface في TypeScript؟

كلاهما يُستخدم لتعريف أشكال البيانات (Object Shapes). interface مُخصصة ومثالية للـ Objects وتدعم دمج الإعلانات (Declaration Merging)، بينما type أكثر مرونة وتدعم Union Types وأنواع بدائية.

باستخدام type

type UserType = {
  name: string;
  age: number;
};

// type قوي جداً مع Union
type Status = "success" | "error" | "loading";

باستخدام interface

interface UserInterface {
  name: string;
  age: number;
}

جدول المقارنة

الميزةtypeinterface
وصف Objects✅ نعم✅ نعم (مُفضلة)
دعم Union Types (أكثر من نوع)✅ نعم❌ لا
Declaration Merging (دمج نفس الاسم مرتين)❌ لا✅ نعم
الاستخدام الشائعالأنواع المركبة، والحالاتوصف شكل الـ API Data أو الـ Classes

💡 القاعدة البسيطة: لو بتوصف Object، ابدأ بـ interface. لو محتاج تركيبة معقدة أو Union، استخدم type.

7. يعني إيه Union Type؟

ما هو Union Type في TypeScript؟

Union Type يسمح للمتغير بأن يحمل أكثر من نوع واحد من البيانات. يُستخدم رمز الأنبوب | بين الأنواع. مثلاً string | number يعني أن القيمة يمكن أن تكون نص أو رقم.

مثال

let productId: string | number;

productId = 101;      // ✅ شغال (رقم)
productId = "P-101";  // ✅ شغال (نص)
// productId = true;  // ❌ Error (ليست نص ولا رقم)

Type Narrowing (تضييق النوع)

لما تستخدم Union Type في Function، TS هترفض تنفذ عمليات معينة إلا لو اتأكدت من النوع. هنا بنستخدم typeof:

function displayId(id: string | number) {
  // console.log(id.toUpperCase()); // ❌ Error: لو رقم مش هينفع
  
  if (typeof id === "string") {
    // هنا TS اتأكدت إنه نص
    console.log(id.toUpperCase()); 
  } else {
    // هنا TS اتأكدت إنه رقم
    console.log(id * 2);
  }
}

8. يعني إيه Tuple؟

ما هو Tuple في TypeScript؟

Tuple هو نوع خاص من Arrays (المصفوفات) يسمح بتحديد نوع بيانات كل عنصر بناءً على مكانه (ترتيبه) وتحديد طول الـ Array. يُستخدم بكثرة عندما تكون البيانات مترابطة بترتيب معين.

مثال

// تعريف Tuple (نص، ثم رقم)
let user: [string, number] = ["Ahmed", 25];

// user = [25, "Ahmed"]; // ❌ Error: الترتيب غلط
// user = ["Ahmed", 25, true]; // ❌ Error: الطول غلط

مقارنة: Array vs Tuple

الميزةArray type[]Tuple [type1, type2]
الأنواعغالبًا عنصر واحد مكررأنواع مختلفة لكل عنصر
الترتيبغير مهم نوعًا ماصارم جدًا
الطولمفتوح (غير محدد)محدد مسبقًا

💡 مثال شهير: في React، الـ Hook اللي اسمه useState بيرجع Tuple [state, setState].

9. يعني إيه Enum؟

ما هو Enum في TypeScript؟

Enum (Enumeration) هو طريقة لتعريف مجموعة من الثوابت (Constants) المسماة. يُستخدم لجعل الكود أكثر وضوحًا وقابلية للقراءة عند التعامل مع قيم محددة مسبقًا مثل حالات الطلب أو أدوار المستخدمين.

مثال

enum Role {
  Admin,      // قيمته الافتراضية 0
  User,       // 1
  Guest       // 2
}

let myRole: Role = Role.Admin;
console.log(myRole); // 0

ممكن كمان تحدد القيم بنفسك (String Enum):

enum Status {
  Success = "SUCCESS",
  Error = "ERROR",
  Loading = "LOADING"
}

⚠️ ملاحظة: البعض يُفضل استخدام Union Types type Role = "Admin" | "User" بدلاً من Enums في المشاريع الحديثة لأنها أبسط ولا تُنتج كود JS إضافي، لكن Enums لا تزال شائعة جدًا.

10. يعني إيه Generic؟

ما هي Generics في TypeScript؟

Generics هي أداة تسمح بإنشاء مكونات (Functions أو Classes أو Interfaces) تعمل مع أي نوع بيانات، دون فقدان الـ Type Safety. تُعتبر كـ "متغيرات" ولكن للأنواع (Types) بدلًا من القيم.

المشكلة (بدون Generics)

لو عايز Function ترجع نفس القيمة اللي بتاخدها بس مش عارف النوع مقدماً:

// استخدمنا any، وده بيلغي فايدة TS!
function returnData(data: any): any {
  return data;
}

الحل (باستخدام Generics)

// T تُمثل Type وهمي هيتم تحديده وقت الاستدعاء
function returnData<T>(data: T): T {
  return data;
}

// وقت الاستدعاء
const stringResult = returnData<string>("Hello"); // TS عارفة إن النتيجة string
const numberResult = returnData<number>(100);    // TS عارفة إن النتيجة number

💡 Generics قوية جداً وتُستخدم بكثرة في الـ Arrays، مثل Array<string>.

11. إزاي أعمل Function بـ TypeScript؟

كيف تكتب Function في TypeScript؟

عند كتابة Function في TypeScript، يجب تحديد نوع البيانات للـ Parameters (المدخلات)، وتحديد نوع الـ Return (القيمة المرجعة). يمكن أيضًا تحديد معاملات اختيارية (Optional) أو وضع قيم افتراضية.

مثال كامل

// (a: number, b: number) -> المدخلات
// : number -> الـ Return Type المتوقع
function add(a: number, b: number): number {
  return a + b;
}

Optional Parameters (معاملات اختيارية)

استخدم علامة الاستفهام ? قبل النقطتين:

// message اختياري، return type هو void (مفيش إرجاع)
function logGreeting(name: string, message?: string): void {
  if (message) {
    console.log(name + ": " + message);
  } else {
    console.log("Hello, " + name);
  }
}

logGreeting("Ahmed"); // ✅ شغال
logGreeting("Ahmed", "Welcome!"); // ✅ شغال

12. ليه TypeScript بيطلع Error؟ (أشهر الأخطاء)

لماذا تظهر أخطاء TypeScript؟

تظهر أخطاء TypeScript عندما تكتشف تعارضًا بين النوع الذي حددته (أو استنتجته) والقيمة التي تحاول استخدامها، أو عند محاولة الوصول لخصائص غير موجودة. الهدف منها حمايتك من الأخطاء أثناء التشغيل (Runtime).

أشهر الأخطاء وكيفية حلها:

1. Type 'X' is not assignable to type 'Y'

السبب: بتحاول تحط نوع في نوع تاني.
الحل: اتأكد إن القيمة تتطابق مع النوع.

let score: number = 100;
// score = "high"; // ❌ Error: Type 'string' is not assignable to type 'number'

2. Property 'X' does not exist on type 'Y'

السبب: بتحاول تنادي على property أو method مش موجودة في النوع ده.

let user = { name: "Ahmed", age: 25 };
// console.log(user.email); // ❌ Error: Property 'email' does not exist...
// الحل: ضيف email للـ object أو استخدم Optional Chaining.

3. Object is possibly 'undefined' أو 'null'

السبب: TypeScript خايفة إن العنصر ميكونش موجود. (زي لما تبحث عن عنصر في الـ DOM).

const btn = document.querySelector(".my-btn");
// btn.addEventListener("click", () => {}); // ❌ Error: Object is possibly 'null'

// الحل: Type Narrowing أو Optional Chaining
if (btn) {
  btn.addEventListener("click", () => {}); // ✅
}

كيفية الـ Debugging

  1. اقرأ الـ Error ببطء: TS رسائلها دقيقة جداً.
  2. شوف السطر المذكور: بيشاور فين بالظبط.
  3. تأكد من الـ Types: اسأل نفسك: TS كانت متوقعة إيه؟ وأنا اديتها إيه؟

13. يعني إيه string | number؟

ما معنى string | number في TypeScript؟

هذا يُسمى Union Type. وهو يعني أن المتغير أو الـ Parameter يمكن أن يقبل قيمة من نوع نص (string) أو قيمة من نوع رقم (number). إذا أدخلت نوعًا ثالثًا (مثل boolean) سيظهر خطأ.

let mixedData: string | number;

mixedData = "Hello"; // ✅
mixedData = 500;     // ✅
// mixedData = true; // ❌ Error

لما تستخدمه في Function، لازم تعمل Type Narrowing عشان تتعامل مع الخصائص الخاصة بكل نوع (زي toUpperCase للنصوص بس).

14. إزاي أعمل Compile لـ TypeScript؟

كيف أقوم بتحويل (Compile) كود TypeScript إلى JavaScript؟

باستخدام أمر tsc (TypeScript Compiler). المتصفحات لا تفهم TypeScript، لذلك يجب تحويل ملفات .ts إلى ملفات .js ليتم تشغيلها.

التحويل الأساسي لملف واحد

في الـ Terminal، لو عندك ملف اسمه app.ts:

tsc app.ts

الناتج هيكون ملف جديد اسمه app.js تقدر تربطه بـ HTML بتاعك.

استخدام tsconfig.json (للمشاريع)

في المشاريع، مش منطقي نعمل compile لكل ملف لوحده. بنعمل ملف إعدادات:

tsc --init

ده هينشئ ملف tsconfig.json. أهم الإعدادات جواه:

  • target: إصدار JS اللي هيتم التحويل ليه (مثل ES6).
  • rootDir: المجلد اللي فيه ملفات TS بتاعتك (مثل ./src).
  • outDir: المجلد اللي هتتحط فيه ملفات JS الناتجة (مثل ./dist).
  • strict: تفعيل الفحص الصارم للأنواع (مهم جداً).

بعد الإعدادات، ببساطة اكتب tsc في الـ Terminal، وهيحوّل كل المشروع.

15. الفرق بين ملف .ts و .js

ما الفرق بين امتداد .ts وامتداد .js؟

ملف .js هو ملف JavaScript قياسي يمكن للمتصفح أو Node.js تشغيله مباشرة. ملف .ts هو ملف TypeScript يحتوي على Types، ولا يمكن تشغيله مباشرة، بل يجب عمل Compile له لينتج ملف .js.

المعيارملف .tsملف .js
المحتوىJavaScript + Types + InterfacesJavaScript فقط
التشغيل المباشر❌ المتصفحات لا تفهمه✅ يشتغل في المتصفح و Node
الـ Type Safety✅ قوي جدًا في الـ Editor❌ ضعيف/معدوم

💡 ملحوظة: لو نسخت كود من ملف .js وحطيته في .ts، هيشتغل غالباً بدون مشاكل، بس TS هتبدأ تطلب منك تحسينه بالتدريج.

مشروع TypeScript للمبتدئين: User Management

عشان نطبق اللي تعلمناه، هنعمل هيكل بسيط لـ User Management System يوضح استخدام الـ Types و Interfaces والـ Union.

// 1. تعريف Union Type للحالة
type Status = "active" | "inactive" | "banned";

// 2. تعريف Interface للمستخدم
interface User {
  id: number;
  name: string;
  email: string;
  status: Status;
  phone?: string; // Optional Parameter
}

// 3. تعريف Array من نوع User
let users: User[] = [];

// 4. Function لإضافة مستخدم جديد
function addUser(user: User): void {
  users.push(user);
  console.log(`User ${user.name} added successfully.`);
}

// 5. Function باستخدام Generic للبحث (بحث عام)
function findItem<T>(items: T[], filterFn: (item: T) => boolean): T | undefined {
  return items.find(filterFn);
}

// تجربة الكود
addUser({
  id: 1,
  name: "Ahmed",
  email: "[email protected]",
  status: "active"
  // phone اختياري فمفيش مشكلة إنه مش موجود
});

// بحث عن مستخدم
const foundUser = findItem(users, (u) => u.id === 1);
if (foundUser) {
  console.log("Found:", foundUser.name);
}

المفاهيم المستخدمة: Interface, Type Alias (Union), Array of Objects, Optional Properties, Generics, Functions مع Return Types.

ماذا أتعلم بعد TypeScript؟

ما هو مسار تعلم TypeScript؟ وما الخطوة التالية؟

بعد أساسيات TypeScript (Types, Interfaces)، يجب تعلم Generics، و Utility Types، وكيفية إعداد tsconfig. الخطوة التالية الأهم هي استخدام TypeScript مع Framework مثل React أو Angular لبناء تطبيقات حقيقية.

JavaScript Fundamentals (لازم تكون فاهم JS كويس)

⬇️

TypeScript Basics (Type Annotations, Type Inference)

⬇️

Interfaces & Types (Object Shapes, Union, Intersection)

⬇️

Functions & Tuples & Enums

⬇️

Generics & Type Narrowing

⬇️

Utility Types (Partial, Omit, Pick, Record)

⬇️

tsconfig.json & Modules

⬇️

React / Next.js / Angular مع TypeScript (التطبيق العملي)

الأسئلة الشائعة (FAQ)

هل TypeScript صعبة؟

لا، خصوصاً لو عندك أساس جيد في JavaScript. الصعوبة تكمن فقط في البداية عند التعامل مع الأخطاء (Errors) وفهم الـ Generics، لكن مع التعود ستجدها أسهل وتوفر عليك وقتًا طويلاً.

هل يجب تعلم JavaScript قبل TypeScript؟

نعم، بشدة. لا يمكنك فهم TypeScript بدون فهم JavaScript أولاً، لأن TS هي مجرد أداة فوق JS. يجب فهم المتغيرات، الدوال، المصفوفات، وDOM في JS أولاً.

هل TypeScript مناسبة للمبتدئين؟

للمبتدئين في البرمجة تماماً: لا. ابدأ بـ HTML/CSS/JS. للمبتدئين الذين أتقنوا JS ويريدون الانتقال لمستوى متقدم أو تعلم React/Angular: نعم، هي الخطوة الطبيعية التالية.

هل TypeScript تُستخدم في Front-End أم Backend؟

الاثنين معاً. تُستخدم بكثرة في Front-End مع أطر عمل مثل Angular, React, Vue. وتُستخدم في Backend مع Node.js (NestJS أو Express) لبناء سيرفرات قوية.

ما هو Type Inference؟

هو قدرة TypeScript على استنتاج نوع البيانات تلقائياً بناءً على القيمة التي أعطيتها للمتغير، دون الحاجة لكتابة الـ Type يدوياً (مثلاً let x = 10; ستستنتج أنه number).

ما هو Type Narrowing؟

هو تضييق نوع البيانات. عندما يكون المتغير Union Type (مثلاً string أو number)، تستخدم جمل شرطية (مثل typeof) لتأكيد نوعه داخل بلوك معين لتتمكن من استخدام خصائص هذا النوع بأمان.

🚀 جاهز تنقل الكود بتاعك لمستوى الاحتراف بـ TypeScript؟

لو بدأت JavaScript وحابب تنتقل لـ TypeScript عشان تبني مشاريع أكبر أو تتعلم React و Angular، لكن مش عارف إيه المفاهيم اللي لازم تتعلمها بالترتيب وتطبق عليها إزاي — فريق Syntax Room معاك خطوة بخطوة.

تواصل معنا لمعرفة المسار المناسب لمستواك، وابدأ رحلتك في Front-End Development صح.

اعرف المسار المناسب ليك
الكلمات المفتاحية:تعلم TypeScriptتعلم TypeScript للمبتدئينتعلم TypeScript من الصفرشرح TypeScriptTypeScript للمبتدئينTypeScript Tutorialالفرق بين JavaScript وTypeScriptTypeScript vs JavaScriptType AnnotationTypeScript InterfaceTypeScript TypeUnion TypeTuple TypeScriptEnum TypeScriptGeneric TypeScriptTypeScript FunctionTypeScript ErrorsSyntax Room كورسات
العودة إلى المدونة

تواصل معنا

عبر الواتساب او الماسنجر