أصبح TypeScript هو المعيار لتطوير JavaScript الحديث. في عام 2026، أكثر من 80% من مشاريع JavaScript الجديدة تستخدم TypeScript. يغطي هذا الدليل الكامل كل شيء بدءًا من الأنواع الأساسية وحتى الأنواع المتقدمة وأدوات الديكور وأنماط الإنتاج.
📋 Table of Contents
- لماذا TypeScript في عام 2026؟
- التثبيت والإعداد
- tsconfig.json أفضل الممارسات
- الأنواع الأساسية
- واجهات مقابل أنواع
- الأدوية العامة
- أنواع المرافق
- الأنماط المتقدمة: الأنواع الشرطية
- TypeScript مع React
- مصممو الديكور على الآلة الكاتبة (2026)
- قائمة التحقق من الوضع الصارم
- أدوات TypeScript في عام 2026
- الوجبات السريعة الرئيسية
لماذا TypeScript في عام 2026؟
تتسبب الطبيعة الديناميكية لجافا سكريبت في حدوث أخطاء في وقت التشغيل تكتشفها TypeScript في وقت الترجمة. الفوائد واضحة:
- قبض على الأخطاء في وقت مبكر– أخطاء الكتابة في وقت الترجمة، وليس في الإنتاج
- أدوات أفضل– الإكمال التلقائي وإعادة البناء والتنقل في VS Code
- رمز التوثيق الذاتي– الأنواع بمثابة وثائق مضمنة
- ثقة واسعة النطاق– إعادة هيكلة آمنة عبر آلاف الملفات
التثبيت والإعداد
قم بتثبيت TypeScript عالميًا أو كتبعية للمطور:
# Install TypeScript
npm install -g typescript
# Or as dev dependency
npm install --save-dev typescript
# Check version
tsc --version
# Initialize tsconfig
tsc --init
tsconfig.json أفضل الممارسات
جاهز للإنتاجtsconfig.jsonلعام 2026:
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,
"noImplicitOverride": true,
"lib": ["ES2022", "DOM"],
"outDir": "./dist",
"rootDir": "./src",
"declaration": true,
"sourceMap": true,
"esModuleInterop": true,
"skipLibCheck": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
الأنواع الأساسية
يبدأ نظام الكتابة في TypeScript بالأوليات ثم يتراكم:
// Primitives
const name: string = "Alice";
const age: number = 30;
const active: boolean = true;
const nothing: null = null;
const unknown: undefined = undefined;
// Arrays
const scores: number[] = [95, 87, 92];
const tags: Array<string> = ["ts", "js", "node"];
// Tuples (fixed-length arrays with known types)
const point: [number, number] = [10, 20];
const entry: [string, number] = ["age", 30];
// Union types
let id: string | number = "user_123";
id = 456; // also valid
// Literal types
type Direction = "north" | "south" | "east" | "west";
const dir: Direction = "north";
// any, unknown, never
const userInput: unknown = getUserInput();
if (typeof userInput === "string") {
console.log(userInput.toUpperCase()); // type narrowed to string
}
واجهات مقابل أنواع
كلاهما يحدد أشكال الكائنات، ولكن مع وجود اختلافات رئيسية:
// Interface — can be merged (declaration merging)
interface User {
id: number;
name: string;
email?: string; // optional
}
// Extend interface
interface AdminUser extends User {
role: "admin" | "superadmin";
permissions: string[];
}
// Type alias — more flexible, supports unions and intersections
type ApiResponse<T> = {
data: T;
error: string | null;
status: number;
};
// Intersection type
type AuthUser = User & { token: string };
// Prefer interface for object shapes, type for unions/intersections
const user: AdminUser = {
id: 1,
name: "Alice",
role: "admin",
permissions: ["read", "write"]
};
الأدوية العامة
الأدوية العامة تجعل التعليمات البرمجية قابلة لإعادة الاستخدام مع الحفاظ على النوع الآمن:
// Generic function
function first<T>(arr: T[]): T | undefined {
return arr[0];
}
const num = first([1, 2, 3]); // type: number | undefined
const str = first(["a", "b"]); // type: string | undefined
// Generic with constraints
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user = { id: 1, name: "Alice", age: 30 };
const name = getProperty(user, "name"); // type: string
const id = getProperty(user, "id"); // type: number
// Generic interface
interface Repository<T> {
findById(id: number): Promise<T | null>;
findAll(): Promise<T[]>;
create(item: Omit<T, "id">): Promise<T>;
update(id: number, item: Partial<T>): Promise<T>;
delete(id: number): Promise<void>;
}
// Generic class
class Stack<T> {
private items: T[] = [];
push(item: T): void { this.items.push(item); }
pop(): T | undefined { return this.items.pop(); }
peek(): T | undefined { return this.items[this.items.length - 1]; }
isEmpty(): boolean { return this.items.length === 0; }
}
const stack = new Stack<number>();
stack.push(1);
stack.push(2);
console.log(stack.pop()); // 2
أنواع المرافق
يأتي TypeScript مزودًا بأنواع أدوات مساعدة مدمجة قوية:
interface Product {
id: number;
name: string;
price: number;
description: string;
inStock: boolean;
}
// Partial — all fields optional
type ProductDraft = Partial<Product>;
// Required — all fields required
type FullProduct = Required<Product>;
// Pick — select specific fields
type ProductSummary = Pick<Product, "id" | "name" | "price">;
// Omit — exclude fields
type NewProduct = Omit<Product, "id">;
// Readonly — prevent mutation
type ImmutableProduct = Readonly<Product>;
// Record — map type
type CategoryMap = Record<string, Product[]>;
// ReturnType — extract function return type
async function fetchUser() {
return { id: 1, name: "Alice", email: "alice@example.com" };
}
type User = Awaited<ReturnType<typeof fetchUser>>;
// Parameters — extract function parameters
function createOrder(userId: number, items: string[], total: number) {}
type OrderParams = Parameters<typeof createOrder>;
الأنماط المتقدمة: الأنواع الشرطية
// Conditional type
type IsArray<T> = T extends any[] ? true : false;
type A = IsArray<string[]>; // true
type B = IsArray<string>; // false
// Infer keyword
type UnpackArray<T> = T extends (infer U)[] ? U : T;
type Unpacked = UnpackArray<string[]>; // string
type NotArray = UnpackArray<number>; // number
// Mapped types
type Optional<T> = {
[K in keyof T]?: T[K];
};
// Template literal types (TypeScript 4.1+)
type EventName<T extends string> = `on${Capitalize<T>}`;
type ClickEvent = EventName<"click">; // "onClick"
type FocusEvent = EventName<"focus">; // "onFocus"
// Discriminated unions
type Result<T> =
| { success: true; data: T }
| { success: false; error: string };
function processResult<T>(result: Result<T>): T {
if (result.success) {
return result.data; // TypeScript knows this is T
}
throw new Error(result.error); // TypeScript knows error is string
}
TypeScript مع React
import React, { useState, useCallback, FC } from "react";
interface ButtonProps {
label: string;
onClick: () => void;
variant?: "primary" | "secondary" | "danger";
disabled?: boolean;
children?: React.ReactNode;
}
const Button: FC<ButtonProps> = ({
label,
onClick,
variant = "primary",
disabled = false,
children
}) => {
return (
<button
className={`btn btn-${variant}`}
onClick={onClick}
disabled={disabled}
>
{children ?? label}
</button>
);
};
// Generic component
interface ListProps<T> {
items: T[];
renderItem: (item: T, index: number) => React.ReactNode;
keyExtractor: (item: T) => string | number;
}
function List<T>({ items, renderItem, keyExtractor }: ListProps<T>) {
return (
<ul>
{items.map((item, index) => (
<li key={keyExtractor(item)}>{renderItem(item, index)}</li>
))}
</ul>
);
}
// Custom hook with types
function useLocalStorage<T>(key: string, initialValue: T) {
const [value, setValue] = useState<T>(() => {
const stored = localStorage.getItem(key);
return stored ? JSON.parse(stored) : initialValue;
});
const setStoredValue = useCallback((newValue: T) => {
setValue(newValue);
localStorage.setItem(key, JSON.stringify(newValue));
}, [key]);
return [value, setStoredValue] as const;
}
مصممو الديكور على الآلة الكاتبة (2026)
يدعم الإصدار 5.0+ من TypeScript أدوات تزيين المرحلة 3:
// Class decorator
function singleton<T extends { new(...args: any[]): {} }>(constructor: T) {
let instance: T;
return class extends constructor {
constructor(...args: any[]) {
if (instance) return instance;
super(...args);
instance = this as any;
}
};
}
// Method decorator — log execution time
function measure(_target: any, key: string, descriptor: PropertyDescriptor) {
const original = descriptor.value;
descriptor.value = async function (...args: any[]) {
const start = performance.now();
const result = await original.apply(this, args);
const duration = performance.now() - start;
console.log(`${key} took ${duration.toFixed(2)}ms`);
return result;
};
return descriptor;
}
class UserService {
@measure
async fetchUsers(): Promise<User[]> {
const r = await fetch("/api/users");
return r.json();
}
}
قائمة التحقق من الوضع الصارم
قم بتمكين خيارات المترجم هذه لتحقيق أقصى قدر من الأمان للنوع:
strict: true— تمكن جميع الضوابط الصارمةnoUncheckedIndexedAccess: true– إرجاع الوصول إلى المصفوفةT | undefinedexactOptionalPropertyTypes: true—undefinedغير قابلة للإحالة إلى اختياريnoImplicitOverride: true– يجب استخدامهoverrideالكلمة الرئيسيةnoPropertyAccessFromIndexSignature: true– استخدم تدوين القوس لعلامات الفهرس
أدوات TypeScript في عام 2026
- بيوم– أسرع أداة تنسيق + linter، من نوع TypeScript الأصلي
- tsx– تشغيل ملفات TypeScript مباشرة دون تجميع
- تسوب— مُجمِّع التكوين الصفري لمكتبات TypeScript
- فيتيست– اختبار TypeScript أولاً باستخدام ESM الأصلي
- tRPC– أمان شامل للتطبيقات الكاملة
الوجبات السريعة الرئيسية
يعد TypeScript في 2026 ناضجًا وسريعًا وضروريًا لتطوير JavaScript احترافيًا. ابدأ بـstrict: true، استخدم واجهات لأشكال الكائنات، واعتمد على أنواع الأدوات المساعدة، واستفد من الأدوية العامة للتعليمات البرمجية القابلة لإعادة الاستخدام. لم يكن النظام البيئي للأدوات أفضل من أي وقت مضى.
🔗 Share this article
✍️ Leave a Comment