تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

چگونه در TypeScript نوع‌های سفارشی بسازیم؟


۹ آذر ۱۴۰۴

همانطور که می‌دانید TypeScript یک افزونه قدرتمند برای زبان جاوااسکریپت است که با اضافه کردن قابلیت بررسی نوع‌ها در زمان کامپایل، به توسعه‌دهندگان اجازه می‌دهد از تمام امکانات اکوسیستم جاوااسکریپت بهره‌مند شوند و در عین حال از ویژگی‌های پیشرفته‌ای مانند نوع‌های ایستا، شمارش‌ها (enums)، کلاس‌ها و رابط‌ها (interfaces) استفاده کنند. این ترکیب، توسعه نرم‌افزارهای پایدار و مقیاس‌پذیر را آسان‌تر می‌کند.

در این مقاله از لیارا، به شما نشان می‌دهیم که چگونه می‌توانید نوع‌های سفارشی (Custom Types) را در TypeScript تعریف کنید، چگونه از ترکیب نوع‌ها با استفاده از اتحاد (Union) و تقاطع (Intersection) بهره ببرید و چگونه از نوع‌های کاربردی (Utility Types) برای انعطاف‌پذیری بیشتر استفاده کنید. این آموزش به گونه‌ای طراحی شده که هم برای توسعه‌دهندگان مبتدی قابل فهم باشد و هم برای حرفه‌ای‌ها کاربردی و عمیق باشد. همچنین، به استفاده از ابزارهای مدرن مثل دستیارهای کدنویسی هوش مصنوعی (مانند GitHub Copilot و Codeium) برای بهبود فرآیند توسعه و اطمینان از صحت نوع‌ها در پروژه‌های بزرگ پرداخته‌ایم.

می‌توانید مثال‌های این مقاله را در محیط TypeScript خود یا در TypeScript Playground (یک ابزار آنلاین برای نوشتن و تست کدهای TypeScript در مرورگر) امتحان کنید.

با هوش مصنوعی لیارا، دسترسی سریع و پایدار به API هوش مصنوعی داشته باشید.
✅ ارائه API هوش مصنوعی✅ ادغام آسان با سرویس‌ها و اپلیکیشن‌ها✅ مقیاس‌پذیری و امنیت بالا
خرید و راه‌اندازی سرویس هوش مصنوعی

“برای راه‌اندازی سریع و بدون دردسر برنامه‌های Typesense، از مستندات لیارا استفاده کنید.”

آنچه در ادامه خواهید خواند:

  • چرا نوع‌های سفارشی در TypeScript مهم هستند؟
  • تعریف نوع‌های سفارشی در TypeScript
  • ترکیب نوع‌ها: اتحاد (Union) و تقاطع (Intersection)
  • استفاده از نوع‌های کاربردی (Utility Types)
  • استفاده از ابزارهای هوش مصنوعی برای بهبود توسعه
  • مقیاس‌پذیری در پروژه‌های بزرگ
  • جمع بندی

چرا نوع‌های سفارشی در TypeScript مهم هستند؟

TypeScript با ارائه نوع‌های پایه‌ای مانند string، number، boolean و غیره، بسیاری از نیازهای اولیه برنامه‌نویسی را برآورده می‌کند. اما وقتی پروژه شما پیچیده‌تر می‌شود، نیاز به تعریف نوع‌های خاص برای داده‌های پروژه‌تان احساس می‌شود. نوع‌های سفارشی به شما کمک می‌کنند تا:

  • کاهش خطاها: با تعریف دقیق ساختار داده‌ها، احتمال بروز خطاهای منطقی کاهش می‌یابد.
  • مستندسازی بهتر: نوع‌های سفارشی به‌عنوان مستندات خودکار عمل می‌کنند و کد شما را خواناتر می‌کنند.
  • انعطاف‌پذیری بیشتر: با ترکیب نوع‌ها و استفاده از ابزارهای TypeScript، می‌توانید ساختارهای پیچیده‌ای را با دقت بالا مدیریت کنید.

در ادامه، با مثال‌های عملی و کاربردی، نحوه استفاده از این قابلیت‌ها را بررسی می‌کنیم.

چرا نوع‌های سفارشی در TypeScript مهم هستند؟

تعریف نوع‌های سفارشی در TypeScript

برای شروع، فرض کنید در حال توسعه یک برنامه مدیریت کاربران هستید. هر کاربر اطلاعاتی مانند نام، ایمیل و نقش (role) دارد. می‌توانید یک نوع سفارشی برای کاربر به این صورت تعریف کنید:

type User = {
  name: string;
  email: string;
  role: "admin" | "user" | "guest";
};

در این کد:

  • نوع User یک شیء با سه ویژگی name، email و role تعریف می‌کند.
  • ویژگی role از نوع اتحاد (Union Type) است که فقط مقادیر مشخصی (admin، user یا guest) را قبول می‌کند.

حالا می‌توانید از این نوع در کد خود استفاده کنید:

const user: User = {
  name: "John Doe",
  email: "[email protected]",
  role: "admin",
};

اگر سعی کنید مقداری نادرست به role اختصاص دهید (مثلاً role: “superuser”)، TypeScript خطای کامپایل می‌دهد:

const invalidUser: User = {
  name: "Jane Smith",
  email: "[email protected]",
  role: "superuser", // "superuser" با "admin" | "user" | "guest" 
};

این بررسی نوع در زمان کامپایل، از بروز خطاها در زمان اجرا جلوگیری می‌کند.

ترکیب نوع‌ها: اتحاد (Union) و تقاطع (Intersection)

اتحاد (Union Types)

اتحاد به شما امکان می‌دهد چندین نوع را با استفاده از عملگر ترکیب کنید. مثلاً فرض کنید می‌خواهید یک تابع بنویسید که اطلاعاتی را نمایش می‌دهد و این اطلاعات می‌تواند یک رشته یا یک عدد باشد:

function displayInfo(info: string | number): void {
  console.log(`Information: ${info}`);
}

displayInfo("Hello, World!"); // 
displayInfo(42); // 
displayInfo(true); // : boolean با string | number 

تقاطع (Intersection Types)

تقاطع (با عملگر &) به شما اجازه می‌دهد ویژگی‌های چند نوع را با هم ترکیب کنید. فرض کنید دو نوع Person و Employee دارید:

type Person = {
  name: string;
  age: number;
};

type Employee = {
  employeeId: string;
  department: string;
};

type Staff = Person & Employee;

const staffMember: Staff = {
  name: "Alex Brown",
  age: 30,
  employeeId: "E123",
  department: "Software Development",
};

در اینجا، نوع Staff ترکیبی از ویژگی‌های Person و Employee است و تمام ویژگی‌های هر دو نوع باید در شیء وجود داشته باشد.

 (Union) و تقاطع (Intersection)

استفاده از نوع‌های کاربردی (Utility Types)

TypeScript مجموعه‌ای از نوع‌های کاربردی را ارائه می‌دهد که کار با نوع‌ها را آسان‌تر می‌کنند. در ادامه چند نمونه پرکاربرد را بررسی می‌کنیم:

1. Partial<T>

این نوع، تمام ویژگی‌های نوع T را اختیاری (optional) می‌کند. مثلاً اگر بخواهید یک کاربر را به‌روزرسانی کنید و فقط برخی از ویژگی‌ها را تغییر دهید:

type UserUpdate = Partial<User>;

const update: UserUpdate = {
  name: "Sarah Wilson", // 
};

2. Pick<T, K>

این نوع به شما امکان می‌دهد فقط برخی از ویژگی‌های یک نوع را انتخاب کنید. مثلاً اگر بخواهید فقط name و email از نوع User را استفاده کنید:

type UserSummary = Pick<User, "name" | "email">;

const summary: UserSummary = {
  name: "Mike Johnson",
  email: "[email protected]",
};

3. Omit<T, K>

برعکس Pick، این نوع ویژگی‌های مشخص‌شده را از نوع T حذف می‌کند:

type UserWithoutRole = Omit<User, "role">;

const userNoRole: UserWithoutRole = {
  name: "Emma Davis",
  email: "[email protected]",
};

این نوع‌های کاربردی به شما کمک می‌کنند تا نوع‌های پیچیده را به‌سادگی مدیریت کنید.

استفاده از ابزارهای هوش مصنوعی برای بهبود توسعه

ابزارهای مدرن مثل GitHub Copilot و Codeium می‌توانند در تعریف نوع‌ها و اطمینان از صحت آن‌ها بسیار مفید باشند. این ابزارها می‌توانند:

  • تکمیل خودکار نوع‌ها: پیشنهادهایی برای تعریف نوع‌های سفارشی بر اساس کد موجود ارائه می‌دهند.
  • رفاکتورینگ: به شما کمک می‌کنند تا نوع‌های پیچیده را ساده‌تر کنید یا ساختار کد را بهبود دهید.
  • تولید نوع‌ها از APIها: اگر از APIهای خارجی استفاده می‌کنید، این ابزارها می‌توانند نوع‌های TypeScript را از روی مستندات JSON Schema تولید کنند.

برای مثال، فرض کنید یک API دارید که داده‌های زیر را برمی‌گرداند:

{
  "id": 1,
  "title": "New Project",
  "completed": false
}

ابزارهای هوش مصنوعی می‌توانند به‌صورت خودکار نوع زیر را تولید کنند:

type Task = {
  id: number;
  title: string;
  completed: boolean;
};

تنظیمات سخت‌گیرانه کامپایلر

برای اطمینان از نوع‌امن بودن پروژه، از تنظیمات سخت‌گیرانه در فایل tsconfig.json استفاده کنید:

{
  "compilerOptions": {
    "strict": true,
    "noImplicitAny": true,
    "strictNullChecks": true
  }
}

این تنظیمات خطاهای احتمالی را در زمان کامپایل شناسایی می‌کنند و از مشکلات در زمان اجرا جلوگیری می‌کنند.

مقیاس‌پذیری در پروژه‌های بزرگ

در پروژه‌های بزرگ یا مونوریپوها، حفظ نوع‌امنی چالش‌برانگیز است. برای مدیریت بهتر:

  1. اعتبارسنجی در زمان اجرا: از کتابخانه‌هایی مثل zod یا io-ts برای اعتبارسنجی داده‌های دریافتی از APIها استفاده کنید.
  2. تولید خودکار نوع‌ها: ابزارهایی مثل openapi-typescript می‌توانند نوع‌های TypeScript را از مستندات OpenAPI تولید کنند.
  3. اتوماسیون CI: با استفاده از ابزارهای CI/CD (مثل GitHub Actions)، بررسی نوع‌ها را در فرآیند توسعه ادغام کنید تا خطاها به‌صورت خودکار شناسایی شوند.
  4. کنترل‌های نظارتی: قوانین و استانداردهای مشخصی برای تعریف نوع‌ها در تیم تنظیم کنید تا کد یکپارچه و قابل نگهداری باشد.
استفاده از نوع‌های کاربردی (Utility Types)

جمع بندی

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

این مقاله به‌گونه‌ای طراحی شده که هم برای توسعه‌دهندگان مبتدی و هم حرفه‌ای قابل استفاده باشد. با تمرین و استفاده از ابزارهای معرفی‌شده، می‌توانید به یک توسعه‌دهنده TypeScript حرفه‌ای تبدیل شوید!

به اشتراک بگذارید

برچسب‌ها: