TypeScript چیست؟ آموزش کامل و جامع TypeScript

TypeScript چیست؟

TypeScript یک زبان برنامه‌نویسی متن‌باز است که توسط مایکروسافت توسعه یافته و یک سوپرست از JavaScript می‌باشد. این زبان با اضافه کردن سیستم تایپ ایستا، به توسعه‌دهندگان امکان می‌دهد تا کد قوی‌تر و مطمئن‌تری بنویسند.

TypeScript به JavaScript کامپایل می‌شود و می‌تواند در هر محیطی که JavaScript اجرا می‌شود، استفاده شود.
مثال ساده TypeScript
interface User {
  name: string;
  age: number;
}

function greet(user: User): string {
  return `سلام ${user.name}، ${user.age} ساله!`;
}

const user: User = {
  name: "علی",
  age: 25
};

console.log(greet(user));

تاریخچه TypeScript

TypeScript در اکتبر 2012 توسط مایکروسافت معرفی شد. این زبان توسط Anders Hejlsberg، خالق C# طراحی شده است. از زمان معرفی، TypeScript به سرعت محبوبیت پیدا کرد و توسط پروژه‌های بزرگی مانند Angular، Deno و VS Code مورد استفاده قرار گرفت.

نسخه 1.0 TypeScript در سال 2014 منتشر شد و از آن زمان، ویژگی‌های جدید زیادی مانند جنریک‌ها، دکوراتورها و Null Safety به آن اضافه شده است.

ساختار پایه TypeScript

یک پروژه TypeScript معمولاً از فایل‌های با پسوند .ts تشکیل شده است. برای شروع، نیاز به یک فایل پیکربندی tsconfig.json داریم:

tsconfig.json
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}
این فایل تنظیمات کامپایلر TypeScript را مشخص می‌کند و می‌تواند بر اساس نیازهای پروژه تنظیم شود.

انواع داده در TypeScript

TypeScript انواع داده متنوعی را پشتیبانی می‌کند:

انواع داده پایه
// انواع داده پایه
let name: string = "علی";
let age: number = 25;
let isActive: boolean = true;

// آرایه‌ها
let numbers: number[] = [1, 2, 3];
let names: Array<string> = ["علی", "مریم"];

// تاپل
let coordinate: [number, number] = [10, 20];

// enum
enum Direction {
  North,
  South,
  East,
  West
}

// any و unknown
let dynamicValue: any = 4;
let safeUnknown: unknown = "test";

رابط‌ها (Interfaces) در TypeScript

رابط‌ها در TypeScript امکان تعریف قراردادها برای شکل اشیاء را فراهم می‌کنند. این ویژگی به ما کمک می‌کند تا ساختار داده‌ها را به صورت دقیق مشخص کنیم.

مثال استفاده از Interface
interface Vehicle {
  brand: string;
  model: string;
  year: number;
  start(): void;
  stop(): void;
}

class Car implements Vehicle {
  constructor(
    public brand: string,
    public model: string,
    public year: number
  ) {}

  start() {
    console.log(`${this.brand} ${this.model} روشن شد`);
  }

  stop() {
    console.log(`${this.brand} ${this.model} خاموش شد`);
  }
}
رابط‌ها می‌توانند گسترش یابند و ویژگی‌های اختیاری نیز داشته باشند. همچنین می‌توانند برای تعریف توابع و آرایه‌ها نیز استفاده شوند.

کلاس‌ها در TypeScript

کلاس‌ها در TypeScript شامل ویژگی‌های اضافی نسبت به JavaScript هستند، مانند تعریف نوع برای property‌ها، modifier‌های دسترسی و دکوراتورها.

مثال کلاس در TypeScript
class Person {
  private id: number;
  protected name: string;
  public age: number;

  constructor(name: string, age: number) {
    this.id = Math.random();
    this.name = name;
    this.age = age;
  }

  public introduce(): string {
    return `من ${this.name} هستم و ${this.age} سال دارم.`;
  }
}

class Employee extends Person {
  constructor(
    name: string,
    age: number,
    private department: string
  ) {
    super(name, age);
  }

  public getInfo(): string {
    return `${this.introduce()} من در بخش ${this.department} کار می‌کنم.`;
  }
}
استفاده از any باید محدود شود زیرا مزایای اصلی TypeScript را از بین می‌برد.

جنریک‌ها در TypeScript

جنریک‌ها امکان نوشتن کد انعطاف‌پذیر و قابل استفاده مجدد را فراهم می‌کنند. با استفاده از جنریک‌ها می‌توانیم توابع و کلاس‌هایی بنویسیم که با انواع داده مختلف کار می‌کنند.

مثال استفاده از جنریک‌ها
// تابع جنریک
function getFirstElement<T>(array: T[]): T | undefined {
  return array[0];
}

// کلاس جنریک
class Queue<T> {
  private data: T[] = [];

  push(item: T) {
    this.data.push(item);
  }

  pop(): T | undefined {
    return this.data.shift();
  }
}

// استفاده از جنریک‌ها
const numbers = getFirstElement([1, 2, 3]); // number
const names = getFirstElement(["علی", "رضا"]); // string

const numberQueue = new Queue<number>();
numberQueue.push(10);
جنریک‌ها می‌توانند محدودیت‌هایی نیز داشته باشند که با کلیدواژه extends مشخص می‌شوند.

ماژول‌ها در TypeScript

ماژول‌ها در TypeScript امکان سازماندهی کد و مدیریت وابستگی‌ها را فراهم می‌کنند. هر فایل TypeScript می‌تواند به عنوان یک ماژول در نظر گرفته شود.

مثال استفاده از ماژول‌ها
// math.ts
export interface MathOperations {
  add(a: number, b: number): number;
  subtract(a: number, b: number): number;
}

export class Calculator implements MathOperations {
  add(a: number, b: number): number {
    return a + b;
  }

  subtract(a: number, b: number): number {
    return a - b;
  }
}

// app.ts
import { Calculator, MathOperations } from './math';

const calc: MathOperations = new Calculator();
console.log(calc.add(5, 3)); // 8

دکوراتورها در TypeScript

دکوراتورها ویژگی قدرتمندی در TypeScript هستند که امکان تغییر یا افزودن رفتار به کلاس‌ها، متدها، property‌ها و پارامترها را فراهم می‌کنند.

مثال استفاده از دکوراتور
function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;

  descriptor.value = function(...args: any[]) {
    console.log(`فراخوانی متد ${propertyKey} با پارامترهای: ${JSON.stringify(args)}`);
    const result = originalMethod.apply(this, args);
    console.log(`نتیجه: ${result}`);
    return result;
  };
}

class Calculator {
  @log
  add(a: number, b: number) {
    return a + b;
  }
}
برای استفاده از دکوراتورها باید گزینه experimentalDecorators در تنظیمات TypeScript فعال باشد.

بهترین شیوه‌های کدنویسی TypeScript

برای نوشتن کد TypeScript بهتر و مطمئن‌تر، رعایت اصول زیر توصیه می‌شود:

۱. استفاده از Strict Mode

فعال کردن حالت strict در tsconfig.json برای کشف خطاهای بیشتر در زمان کامپایل.

۲. پرهیز از any

استفاده از unknown به جای any برای type safety بیشتر.

۳. استفاده از Type Inference

اجازه دهید TypeScript در موارد واضح، نوع متغیرها را خودش تشخیص دهد.

مثال بهترین شیوه‌ها
// ❌ بد
let name: string = "علی";
let numbers: number[] = [1, 2, 3];

// ✅ خوب
let name = "علی";
let numbers = [1, 2, 3];

// استفاده از interface به جای type
interface User {
  name: string;
  age: number;
}

// استفاده از readonly برای داده‌های ثابت
interface Config {
  readonly apiKey: string;
  readonly baseUrl: string;
}

ابزارهای مفید برای کار با TypeScript

برای توسعه بهتر با TypeScript، ابزارهای زیر توصیه می‌شوند:

ویرایشگرها و IDE‌ها

– Visual Studio Code (پشتیبانی عالی از TypeScript)
– WebStorm
– Atom با پلاگین‌های TypeScript

ابزارهای تست و کیفیت کد

– Jest با ts-jest
– ESLint با @typescript-eslint
– Prettier برای فرمت‌دهی کد

استفاده از VS Code به دلیل پشتیبانی داخلی از TypeScript و ابزارهای مفید آن توصیه می‌شود.

مهاجرت از JavaScript به TypeScript

برای مهاجرت تدریجی از JavaScript به TypeScript، می‌توانید این مراحل را دنبال کنید:

مراحل مهاجرت به TypeScript
// 1. تغییر پسوند فایل‌ها از .js به .ts
// 2. اضافه کردن tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "allowJs": true,
    "checkJs": true,
    "strict": false,
    "noImplicitAny": false
  }
}

// 3. شروع اضافه کردن type‌ها
// قبل
function calculateTotal(price, quantity) {
  return price * quantity;
}

// بعد
function calculateTotal(price: number, quantity: number): number {
  return price * quantity;
}
در ابتدا می‌توانید strict mode را غیرفعال کنید و به تدریج آن را فعال کنید تا مهاجرت ساده‌تر شود.

کلمات کلیدی:

TypeScript JavaScript برنامه‌نویسی تایپ‌دار آموزش TypeScript مایکروسافت توسعه وب برنامه‌نویسی وب Angular

جمع‌بندی:

در این مقاله به طور جامع با TypeScript و ویژگی‌های اصلی آن آشنا شدیم. آموختیم که TypeScript چیست، چگونه کار می‌کند و چطور می‌تواند به ما در نوشتن کد مطمئن‌تر و قابل‌نگهداری‌تر کمک کند. با مفاهیم اصلی مانند سیستم تایپ، رابط‌ها، کلاس‌ها و جنریک‌ها آشنا شدیم. برای تسلط بیشتر بر TypeScript، پیشنهاد می‌کنیم مستندات رسمی را مطالعه کرده و پروژه‌های عملی انجام دهید.

Leave a Reply

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