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

ورقة غش TypeScript

آخر تحديث

الأنواع الأساسية

الأنواع الأولية وكيفية توصيف المتغيرات.

العمليةالصيغة
نص (string)let name: string = "Ada";
رقمlet age: number = 25;
Booleanlet ok: boolean = true;
مصفوفة من Tlet xs: number[] = [1, 2, 3];
مصفوفة genericlet xs: Array<string> = [];
Tuplelet pair: [string, number] = ["a", 1];
Any (تعطيل النوع)let x: any = 1;
Unknown (any آمن)let x: unknown = JSON.parse(s);
Void (بدون قيمة عائدة)function log(): void { … }
Never (لا تعود أبدًا)function fail(): never { throw … }
Null / undefinedlet n: null = null;

استنتاج النوع وتوصيفه

متى تترك TS يستنتج، ومتى تكتب التوصيف بنفسك.

العمليةالصيغة
مستنتج من القيمةlet count = 0; // number
توصيف صريحlet count: number = 0;
معامل دالةfunction add(a: number, b: number) { … }
نوع القيمة المُعادةfunction add(a: number, b: number): number { … }
دالة سهميةconst sq = (x: number): number => x * x;
Type assertionconst el = input as HTMLInputElement;
Const assertion (literal)const dirs = ["up", "down"] as const;
Non-null assertionel!.focus();

الواجهات (Interfaces)

صف شكل الكائن.

العمليةالصيغة
إعلانinterface User { id: number; name: string; }
خاصية اختياريةinterface User { age?: number; }
خاصية readonlyinterface User { readonly id: number; }
توقيع دالةinterface Logger { log(msg: string): void; }
توسيع واجهة أخرىinterface Admin extends User { role: string; }
توقيع indexinterface Map { [key: string]: number; }
تطبيق في صفclass Db implements Logger { … }

Type alias والـ unions

سمِّ نوعًا واجمع الأنواع باستخدام | و &.

العمليةالصيغة
Type aliastype ID = string | number;
Alias لكائنtype User = { id: number; name: string };
نوع uniontype Status = "idle" | "loading" | "done";
نوع intersectiontype Admin = User & { role: string };
نوع literaltype Yes = "yes";
يقبل nulltype Maybe<T> = T | null | undefined;
Alias لدالةtype Handler = (e: Event) => void;

الدوال

معاملات وأنواع عائدة موصّفة، مع overload.

العمليةالصيغة
معامل اختياريfunction greet(name?: string) { … }
قيمة افتراضيةfunction greet(name = "friend") { … }
معاملات restfunction sum(...ns: number[]): number { … }
نوع دالةlet fn: (a: number) => number;
واجهة قابلة للاستدعاءinterface Fn { (x: number): number; }
توقيعات overloadfunction f(x: string): string; function f(x: number): number; function f(x: any) { return x; }
تجاهل voidconst cb: () => void = () => 42; // ok

الأصناف (Classes)

أصناف بمعدِّلات وصول وخصائص في المعاملات.

العمليةالصيغة
إعلان صنفclass User { name: string; }
Constructorconstructor(name: string) { this.name = name; }
خاصية في المعاملconstructor(public name: string) {}
Public / private / protectedprivate id: number;
حقل readonlyreadonly id: number;
عنصر staticstatic count = 0;
Getter / setterget name() { return this._name; }
وراثةclass Admin extends User { … }
صنف abstractabstract class Shape { abstract area(): number; }

Generics

أنواع قابلة لإعادة الاستخدام، معلّمة بأنواع أخرى.

العمليةالصيغة
دالة genericfunction id<T>(x: T): T { return x; }
استدعاء بنوع صريحid<string>("hi");
واجهة genericinterface Box<T> { value: T; }
Alias generictype Pair<A, B> = [A, B];
صنف genericclass Stack<T> { items: T[] = []; }
قيد عبر extendsfunction len<T extends { length: number }>(x: T) { return x.length; }
معامل نوع افتراضيinterface Box<T = string> { value: T; }
معامل keyoftype K = keyof User; // "id" | "name"
وصول عبر indextype Name = User["name"];

Narrowing

قلِّص union إلى نوع واحد في وقت التشغيل.

العمليةالصيغة
فحص typeofif (typeof x === "string") { … }
فحص instanceofif (e instanceof Error) { … }
معامل inif ("name" in obj) { … }
Narrowing بالمساواةif (status === "done") { … }
بالـ truthinessif (value) { … }
type guard مخصصfunction isUser(x: any): x is User { return "id" in x; }
Discriminated uniontype Shape = { kind: "sq"; size: number } | { kind: "ci"; r: number };
شمولية مع neverconst _: never = shape;

Enums

مجموعات ثوابت مُسمَّاة.

العمليةالصيغة
Enum عدديenum Direction { Up, Down, Left, Right }
Enum نصيenum Status { Idle = "IDLE", Done = "DONE" }
استخدام قيمةlet d: Direction = Direction.Up;
Const enum (inline)const enum Color { Red, Green, Blue }
Union من literals (الأسلوب الحديث)type Status = "idle" | "done";

أنواع Utility

مساعدات مدمجة تحوّل الأنواع الموجودة.

العمليةالصيغة
كل الخصائص اختياريةPartial<User>
كل الخصائص مطلوبةRequired<User>
كل الخصائص readonlyReadonly<User>
اختيار مجموعة جزئية من المفاتيحPick<User, "id" | "name">
استبعاد مفتاح أو أكثرOmit<User, "password">
كائن بالمفاتيح المعطاةRecord<string, number>
استبعاد من unionExclude<"a" | "b" | "c", "a">
استخراج فقط من unionExtract<"a" | "b", "a" | "c">
إزالة null / undefinedNonNullable<string | null>
نوع قيمة الإرجاعReturnType<typeof fn>
tuple من المعاملاتParameters<typeof fn>
نوع Promise بعد الحلAwaited<Promise<string>>

الوحدات (Modules)

import و export عبر الملفات.

العمليةالصيغة
Export مُسمَّىexport function add(a: number, b: number) { … }
Export افتراضيexport default class User { … }
إعادة exportexport { User } from "./user";
Import مُسمَّىimport { add } from "./math";
Import افتراضيimport User from "./user";
Import للنوع فقطimport type { User } from "./user";
استيراد الكلimport * as math from "./math";
مرجع triple-slash/// <reference types="node" />

أساسيات tsconfig

أعلام المُجمِّع التي تستحق المعرفة.

الخيارالأثر
"strict": trueتفعيل كل فحوصات الوضع الصارم (موصى به).
"target": "ES2022"نسخة JavaScript التي يُصدرها tsc.
"module": "ESNext"نظام الوحدات في المخرجات.
"moduleResolution": "bundler"حل الوحدات كما تفعل الـ bundlers الحديثة.
"jsx": "react-jsx"تفعيل JSX لـ React 17+.
"esModuleInterop": trueاستيرادات افتراضية أنظف من CommonJS.
"skipLibCheck": trueتجاوز فحص الأنواع في node_modules (بناء أسرع).
"noEmit": trueفحص الأنواع فقط — المخرجات يولّدها الـ bundler.

أكثر صيغ TypeScript استخدامًا في صفحة واحدة. ورقة الغش هذه مرجع سريع للاستخدام اليومي لـ TS: الأنواع الأساسية، الواجهات، type aliases، الـ generics، الـ unions، الـ narrowing، وأنواع utility المدمجة.

كل ما هنا هو TypeScript قياسي يُترجَم بـ tsc ويعمل في أي مكان يعمل فيه JavaScript الحديث. انسخ ما تحتاج، أو جرّب أي مقتطف مباشرةً في playground الخاص بـ TypeScript — بلا تثبيت.

أسئلة شائعة حول ورقة غش TypeScript

هل ورقة غش TypeScript هذه مجانية؟
نعم. ورقة غش TypeScript هذه مجانية بالكامل ودون تسجيل. أضِفها إلى المفضلة وارجع إليها متى احتجت إلى مراجعة نوع، أو واجهة، أو نوع utility.
ما الفرق بين interface و type alias؟
كلاهما يمكن أن يصف شكل الكائن، وفي معظم الحالات اليومية يمكن استبدال أحدهما بالآخر. الـ interface يمكن إعادة فتحه وتوسيعه عبر الملفات (declaration merging)، وهو مفيد لأنواع المكتبات. أما type alias فيمكنه تسمية unions و intersections و tuples و mapped types — أشكال لا يمكن التعبير عنها بـ interface. القاعدة الشائعة: استخدم interface لأشكال الكائنات العامة، و type للـ unions والـ tuples والأنواع المحسوبة.
ما الفرق بين any و unknown؟
any يُعطّل فحص الأنواع كليًا — يسمح لك المُجمِّع بأي شيء معه. unknown آمن نوعيًا: عليك تضييقه (بـ typeof أو instanceof أو type guard) قبل استخدامه. فضِّل unknown للقيم القادمة من مصادر خارجية مثل JSON.parse أو fetch — فهو يجبرك على التحقق قبل الاستخدام.
هل أحتاج لتعلم JavaScript قبل TypeScript؟
نعم — TypeScript هو JavaScript مضافًا إليه نظام أنواع، لذا كل ما تعرفه في JS مفيد. إن كنت لا تزال تبني الأساسيات (المصفوفات، الكائنات، async/await)، فإن ورقة غش JavaScript نقطة بداية جيدة، ودورة JavaScript المجانية من Coddy تغطي نفس الموضوعات بشكل تفاعلي.
هل يمكنني التدرب على TypeScript أونلاين؟
نعم. افتح playground الخاص بـ TypeScript لتشغيل أي مقتطف من هذه الورقة في متصفحك — بلا تثبيت. عندما تريد نهجًا منظمًا، ابدأ من landing الخاص بـ JavaScript وطبّق الأنواع من هذه الصفحة فوقه.
Coddy programming languages illustration

تعلّم TypeScript مع Coddy

ابدأ الآن