🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

دليل TypeScript الكامل 2026: الأنواع والأدوية وأنماط الإنتاج

⏱️5 min read  ·  975 words

أصبح TypeScript هو المعيار لتطوير JavaScript الحديث. في عام 2026، أكثر من 80% من مشاريع JavaScript الجديدة تستخدم TypeScript. يغطي هذا الدليل الكامل كل شيء بدءًا من الأنواع الأساسية وحتى الأنواع المتقدمة وأدوات الديكور وأنماط الإنتاج.

لماذا 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 | undefined
  • exactOptionalPropertyTypes: trueundefinedغير قابلة للإحالة إلى اختياري
  • noImplicitOverride: true– يجب استخدامهoverrideالكلمة الرئيسية
  • noPropertyAccessFromIndexSignature: true– استخدم تدوين القوس لعلامات الفهرس

أدوات TypeScript في عام 2026

  • بيوم– أسرع أداة تنسيق + linter، من نوع TypeScript الأصلي
  • tsx– تشغيل ملفات TypeScript مباشرة دون تجميع
  • تسوب— مُجمِّع التكوين الصفري لمكتبات TypeScript
  • فيتيست– اختبار TypeScript أولاً باستخدام ESM الأصلي
  • tRPC– أمان شامل للتطبيقات الكاملة

الوجبات السريعة الرئيسية

يعد TypeScript في 2026 ناضجًا وسريعًا وضروريًا لتطوير JavaScript احترافيًا. ابدأ بـstrict: true، استخدم واجهات لأشكال الكائنات، واعتمد على أنواع الأدوات المساعدة، واستفد من الأدوية العامة للتعليمات البرمجية القابلة لإعادة الاستخدام. لم يكن النظام البيئي للأدوات أفضل من أي وقت مضى.

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা