TypeScript هو امتداد مصنف بشكل صارم من JavaScript تم تطويره بواسطة Microsoft. يضيف نظام أنواع، واجهات، أدوات عامة ومزينات، مع الحفاظ على التوافق الكامل مع كود JS الموجود. بفضل التحقق من الأنواع في مرحلة الترجمة، يمنع TypeScript فئة كاملة من الأخطاء في React Native و Angular والأطر الأخرى. وفقًا لاستطلاع State of JS (2025)، يستخدم 78% من المطورين المشاركين TypeScript. اعرف المزيد في وثائق TypeScript.
الرئيسية
TypeScript هي لغة برمجة من Microsoft (2012) أنشأها Anders Hejlsberg (مبتكر C# و Turbo Pascal). توسع TypeScript JavaScript بنظام أنواع ثابت، واجهات، أدوات عامة، تعدادات ومزينات. يتم ترجمة كود TS إلى JavaScript نقي (transpilation) باستخدام المترجم tsc أو Babel — الناتج هو JS قياسي يعمل في أي بيئة.
الدافع وراء TypeScript هو قيود JavaScript في المشاريع الكبيرة. يؤدي التصنيف الديناميكي لـ JS إلى أخطاء تُكتشف فقط في وقت التشغيل: undefined is not a function, Cannot read property of null. ينقل TypeScript التحقق من الأنواع إلى مرحلة الترجمة، مما يمنع هذه الأخطاء قبل تنفيذ الكود. كلما كان المشروع أكبر، كانت فوائد TS أكبر: في قاعدة كود من 100,000+ سطر، تمنع TS مئات الأخطاء المحتملة.
ميزة رئيسية لـ TypeScript هي التصنيف الصارم مع العلم الاختياري strict: true في tsconfig.json. الوضع الصارم يفعل جميع التحققات: strictNullChecks (null/undefined غير متوافقين مع الأنواع الأخرى)، noImplicitAny (يمنع any الضمني)، strictFunctionTypes (التباين المعاكس لمعاملات الدوال). افتراضيًا، يُوصى بـ strict: true لجميع المشاريع الجديدة.
TypeScript يختلف عن JavaScript فقط في مرحلة التطوير. بعد الترجمة، يتم مسح الأنواع — وقت التشغيل ينفذ JS عادي دون فقدان الأداء. هذا مقايضة: التطوير يتطلب خطوة ترجمة إضافية، لكنه يوفر إكمال تلقائي في IDE، إعادة هيكلة مع إعادة تسمية الرموز وتوثيق الأنواع مباشرة في الكود.
| الجانب | JavaScript | TypeScript |
|---|---|---|
| التصنيف | ديناميكي، وقت التشغيل | ثابت، وقت الترجمة |
| امتداد الملف | .js | .ts (أو .tsx لـ React) |
| أخطاء الأنواع | تُكتشف في وقت التشغيل | تُكتشف قبل التنفيذ |
| الأدوات العامة | لا | نعم (Generic types) |
| الواجهات | لا (JSDoc فقط) | نعم (interface + type) |
| الترجمة | غير مطلوبة | مطلوبة (tsc / Babel) |
نظام أنواع TypeScript هيكلي، وليس اسمي: نوعان متوافقان إذا تطابقت بنيتهما، بغض النظر عن الاسم. هذا يختلف عن Java/C# حيث يتم تحديد التوافق باسم الكلاس أو الواجهة. التصنيف الهيكلي يبسط التكامل مع كود JS الموجود — ليست هناك حاجة لتصريح implements لكل نوع.
TypeScript يدعم أنواع JS البدائية بالإضافة إلى: any (يعطل التحقق)، unknown (any آمن — يتطلب تحققًا قبل الاستخدام)، never (لا يعيد أبدًا)، void (بدون إرجاع)، tuple (صفيف ثابت الطول)، enum (تعداد)، union (string | number)، intersection (A & B)، literal ('red' | 'blue')، index signature ([key: string]: number).
// نظام الأنواع الأساسي لـ TypeScript
// الأنواع البدائية
const name: string = 'React Native';
const version: number = 0.73;
const isReady: boolean = true;
// أنواع Union و Literal
type Platform = 'ios' | 'android' | 'web';
type Status = 'idle' | 'loading' | 'success' | 'error';
function getSDKVersion(platform: Platform): number {
switch (platform) {
case 'ios': return 17;
case 'android': return 34;
case 'web': return 2025;
}
}
// Tuple — صف ثابت الطول
type Coordinate = [number, number];
const position: Coordinate = [55.75, 37.61];
// Enum — تعداد مع زيادة تلقائية
enum AppState {
Background,
Foreground,
Inactive
}
// Unknown — بديل آمن لـ any
function parseJSON(json: string): unknown {
return JSON.parse(json);
}
const data = parseJSON('{"name":"TS"}');
if (typeof data === 'object' && data !== null) {
console.log((data as Record<string, unknown>).name);
}نوع Platform هو اتحاد من القيم الحرفية النصية، يقيد القيم بثلاثة خيارات. إذا مررت 'windows'، سيرمي TypeScript خطأ. Tuple Coordinate يضمن عددين بالضبط — مفيد للإحداثيات أو ألوان RGB. Enum AppState يُترجم إلى كائن مع تعيين عكسي. Unknown يُجبر على التحقق من النوع قبل الاستخدام — على عكس any، unknown آمن افتراضيًا.
الواجهات و type-aliases في TypeScript تصف أشكال الكائنات. تدعم الواجهات دمج التصريحات (إعادة التصريح يضيف حقولًا) والامتداد (extends). يمكن لـ type-aliases وصف الاتحادات، التقاطعات، tuples والأنواع الشرطية، لكنها لا تدعم دمج التصريحات. القاعدة: استخدم interface لكائنات API، و type لكل شيء آخر.
// الواجهات والأنواع لـ React Native
// Interface مع حقول اختيارية
interface User {
id: string;
name: string;
email: string;
avatar?: string; // حقل اختياري
readonly createdAt: Date; // للقراءة فقط
}
// تمديد الواجهة (extends)
interface AdminUser extends User {
role: 'admin';
permissions: string[];
}
// نوع لبيانات API
type ApiResponse<T> = {
data: T;
status: Status;
error?: string;
};
// Utility types — Partial يجعل جميع الحقول اختيارية
type PartialUser = Partial<User>;
// Pick — يختار الحقول المحددة
type UserPreview = Pick<User, 'id' | 'name' | 'avatar'>;
// Record — قاموس بمفاتيح مصنفة
type UserMap = Record<string, User>;الواجهة User مع ? (حقل اختياري) و readonly (للقراءة فقط). ApiResponse<T> هي واجهة عامة لاستجابات API. Partial<User> هو نوع مساعد يجعل جميع الحقول اختيارية (مفيد لنماذج التحرير). Pick<User, 'id' | 'name'> يختار فقط الحقول المحددة — مناسب لمكونات المعاينة. Record<string, User> هو قاموس مستخدمين حسب المعرف.
الأدوات العامة (Generics) هي ميزة رئيسية في TypeScript، تتيح إنشاء مكونات تعمل مع أي نوع دون فقدان أمان الأنواع. تُعرف الدالة العامة بمعامل نوع بين أقواس زاوية: function identity<T>(arg: T): T. النوع T يُستنتج تلقائيًا من الوسيط أو يُحدد صراحة: identity<string>('hello').
الأنواع المساعدة هي أدوات عامة مدمجة لتحويل الأنواع: Partial<T> (جميع الحقول اختيارية)، Required<T> (جميع الحقول إلزامية)، Readonly<T> (جميع الحقول للقراءة فقط)، Pick<T, K> (اختيار الحقول)، Omit<T, K> (استبعاد الحقول)، Record<K, T> (قاموس)، Exclude<T, U> (استبعاد من اتحاد)، Extract<T, U> (استخراج من اتحاد)، NonNullable<T> (استبعاد null/undefined).
// الأدوات العامة في TypeScript
// دالة عامة للعمل مع API
async function fetchData<T>(url: string): Promise<T> {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return response.json() as Promise<T>;
}
// الاستخدام مع نوع محدد
interface Product {
id: number;
title: string;
price: number;
}
const products = await fetchData<Product[]>('/api/products');
// كلاس عام لإدارة الحالة
class StateManager<S> {
private state: S;
constructor(initial: S) {
this.state = initial;
}
getState(): S {
return this.state;
}
updateState(partial: Partial<S>): void {
this.state = { ...this.state, ...partial };
}
}
// عمل مصنف مع Redux Reducer
type Action<T, P> = {
type: T;
payload: P;
};
type UserAction =
| Action<'SET_USER', User>
| Action<'CLEAR_USER', undefined>
| Action<'UPDATE_USER', Partial<User>>;الدالة fetchData<T> هي غلاف مصنف حول fetch. المعامل T يحدد شكل الاستجابة: عند استدعاء fetchData<Product[]>، يعلم TypeScript أن المصفوفة المعادة تحتوي على كائنات Product. كلاس StateManager<S> يدير حالة من أي نوع — Partial<S> للتحديثات الجزئية. Action<T, P> هو اتحاد مميز لأكشنات Redux مع تضييق تلقائي للنوع في switch.
TypeScript في React Native يوفر تصنيفًا صارمًا لـ props وحالة المكونات. CLI React Native ينشئ قالبًا بامتداد .tsx و tsconfig.json. يتم استبدال PropTypes (JS) بواجهات TypeScript — يتم التحقق في مرحلة الترجمة، وليس في وقت التشغيل. styled-components و React Navigation لديهما دعم كامل للأنواع.
React.FC<Props> هو نوع المكون الوظيفي مع props. يتم تصنيف children تلقائيًا. useRef<T> — مرجع لمكون أصلي. useState<S> — حالة مع استنتاج النوع. useNavigation<T> — تنقل مصنف. useCallback، useMemo — مع استنتاج تلقائي للأنواع. جميع hooks React مصنفة بالكامل.
// مكون React Native مصنف
import React, { useState, useCallback } from 'react';
import {
View, Text, FlatList, TouchableOpacity,
StyleSheet
} from 'react-native';
import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
// أنواع للتنقل والبيانات
type RootStackParamList = {
Home: undefined;
Profile: { userId: string };
Settings: undefined;
};
type NavigationProp =
NativeStackNavigationProp<RootStackParamList, 'Home'>;
// واجهة لـ props
interface ProductListProps {
products: Product[];
onSelect: (id: number) => void;
}
// مكون وظيفي مصنف
const ProductList: React.FC<ProductListProps> = ({
products,
onSelect
}) => {
const navigation = useNavigation<NavigationProp>();
const [selectedId, setSelectedId] = useState<number | null>(null);
const handlePress = useCallback((id: number) => {
setSelectedId(id);
onSelect(id);
navigation.navigate('Profile', { userId: String(id) });
}, [onSelect, navigation]);
const renderItem = useCallback(({ item }: { item: Product }) => (
<TouchableOpacity onPress={() => handlePress(item.id)}>
<Text>{item.title}</Text>
<Text>${item.price.toFixed(2)}</Text>
</TouchableOpacity>
), [handlePress]);
return (
<FlatList
data={products}
renderItem={renderItem}
keyExtractor={(item) => String(item.id)}
/>
);
};نوع RootStackParamList هو قاموس للمسارات مع معاملاتها. NavigationProp يوفر تنقلًا مصنفًا: navigation.navigate('Profile', { userId }) يتحقق من أن Profile يقبل userId. useCallback مع معاملات مصنفة يمنع إعادة التصيير غير الضرورية. FlatList يُصنف عبر الأدوات العامة:
أدوات TypeScript تشمل المترجم tsc، tsconfig.json، دعم IDE في VS Code، ESLint مع @typescript-eslint، Prettier و DefinitelyTyped (@types/*). tsc هو المترجم الذي يحول .ts إلى .js. tsconfig.json يهيئ: target (ES2020)، module (ESNext)، strict: true، outDir (مجلد الإخراج). sourceMap — تصحيح TS في المتصفح عبر خرائط الكود.
DefinitelyTyped هو مستودع لتعريفات الأنواع للمكتبات دون أنواع مدمجة. التثبيت: npm install @types/react @types/react-native --save-dev. ملفات .d.ts هي تصريحات أنواع. المكتبات الحديثة (React، React Native، Angular) تتضمن أنواعًا مدمجة ولا تتطلب @types/. بالنسبة لمكتبات JS القديمة، DefinitelyTyped هو المصدر الوحيد للأنواع.
// tsconfig.json — تهيئة أدنى
{
"compilerOptions": {
"target": "esnext",
"module": "commonjs",
"strict": true,
"jsx": "react-native",
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"noEmit": true // تحقق فقط، بدون إنشاء JS
},
"include": ["src/**/*.ts", "src/**/*.tsx"],
"exclude": ["node_modules", "babel.config.js"]
}الخيار strict: true يفعل جميع تحققات الأنواع — موصى به لجميع المشاريع. jsx: 'react-native' يحافظ على JSX دون تحويل (React Native يعالج JSX عبر Babel). moduleResolution: 'node' — تحليل الوحدات كما في Node.js. esModuleInterop — التوافق مع وحدات CommonJS. noEmit: true — تحقق فقط دون إنشاء ملفات JS (Babel أو Metro يولد JS).
الأسئلة الشائعة
TypeScript هو امتداد مصنف بشكل صارم من JavaScript من Microsoft (2012). يضيف تصنيفًا ثابتًا، واجهات، أدوات عامة، تعدادات ومزينات. يُترجم إلى JS نقي عبر tsc. متوافق مع أي كود JS. يُستخدم في React Native (~65% من المشاريع الجديدة)، Angular و Node.js. أنشأه Anders Hejlsberg (مبتكر C#).
TypeScript يوفر تصنيفًا صارمًا لـ props وحالة مكونات React — يتم اكتشاف أخطاء الأنواع في مرحلة الترجمة، وليس في وقت التشغيل. يعمل الإكمال التلقائي في IDE لجميع المكتبات. تصنف الأدوات العامة الهياكل المعقدة (Redux store، API). React Navigation لديه تصنيف كامل للمسارات. وفقًا للاستطلاعات، 78% من مطوري JS يستخدمون TypeScript.
المترجم tsc يحلل ملفات .ts/.tsx، يتحقق من الأنواع، يزيل التعليقات التوضيحية ويولد .js. الهدف (ES5، ES2020) يُحدد في tsconfig.json. TypeScript لا يغير وقت التشغيل — الأنواع الممسوحة لا تؤثر على الأداء. خرائط المصدر تربط JS المترجم بـ TS الأصلي للتصحيح. Babel مع @babel/preset-typescript هو بديل لـ tsc.
TypeScript يشمل جميع أنواع JS: string، number، boolean، null، undefined، symbol، any. يضيف: void، never، unknown، tuple، enum، union (string | number)، intersection (A & B)، literal ('red' | 'blue')، Record، Pick، Omit، Partial، Required، Readonly، Extract، Exclude، NonNullable. الأدوات العامة تنشئ أنواعًا معممة: Array<number>، Promise<string>، Map<string, User>.
المترجم tsc مضمن في حزمة typescript npm. VS Code — IDE مع دعم TS أصلي، إكمال تلقائي، إعادة هيكلة. tsconfig.json يهيئ الوضع الصارم. ESLint مع @typescript-eslint/parser — تحليل ثابت. Prettier — تنسيق. DefinitelyTyped (@types/*) — أنواع للمكتبات دون دعم مدمج. React Native CLI يتضمن قالب TypeScript.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.