TypeScript چیست؟ آموزش کامل و جامع TypeScript
فهرست مطالب
- TypeScript چیست؟
- تاریخچه TypeScript
- ساختار پایه TypeScript
- انواع داده در TypeScript
- رابطها (Interfaces) در TypeScript
- کلاسها در TypeScript
- جنریکها در TypeScript
- ماژولها در TypeScript
- دکوراتورها در TypeScript
- بهترین شیوههای کدنویسی TypeScript
- ابزارهای مفید برای کار با TypeScript
- مهاجرت از JavaScript به TypeScript
TypeScript چیست؟
TypeScript یک زبان برنامهنویسی متنباز است که توسط مایکروسافت توسعه یافته و یک سوپرست از JavaScript میباشد. این زبان با اضافه کردن سیستم تایپ ایستا، به توسعهدهندگان امکان میدهد تا کد قویتر و مطمئنتری بنویسند.
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 مورد استفاده قرار گرفت.
ساختار پایه TypeScript
یک پروژه TypeScript معمولاً از فایلهای با پسوند .ts تشکیل شده است. برای شروع، نیاز به یک فایل پیکربندی tsconfig.json داریم:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
انواع داده در 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 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های دسترسی و دکوراتورها.
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} کار میکنم.`;
}
}
جنریکها در 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);
ماژولها در 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;
}
}
بهترین شیوههای کدنویسی 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 برای فرمتدهی کد
مهاجرت از JavaScript به TypeScript
برای مهاجرت تدریجی از JavaScript به 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;
}