در جلسات قبلی یاد گرفتیم که چگونه با استفاده از تایپ‌گذاری دقیق، خطاهای برنامه‌نویسی را کاهش دهیم. با این حال، گاهی اوقات در برنامه‌نویسی با داده‌هایی روبرو می‌شویم که نوع آن‌ها را از قبل نمی‌دانیم (مثلاً داده‌هایی که از یک API خارجی دریافت می‌شوند).

TypeScript برای مدیریت این شرایط دو نوع داده‌ی ویژه ارائه کرده است: any و unknown. در این جلسه بررسی می‌کنیم که این دو چه تفاوتی دارند و چرا باید تا حد امکان از any دوری کنیم.


نوع داده any چیست؟

any یکی از انعطاف‌پذیرترین تایپ‌ها در TypeScript است. وقتی نوع یک متغیر را any قرار می‌دهید، در واقع به TypeScript می‌گویید: “بررسی‌های تایپی را متوقف کن و اجازه بده هر کاری با این متغیر انجام دهم.”

مثال:

let value: any = "Hello";
value = 100;       // بدون خطا
value = true;      // بدون خطا
value.toUpperCase(); // هیچ خطایی در زمان کامپایل نمی‌دهد (حتی اگر مقدار عدد باشد!)

معایب any:

استفاده از any در واقع دور زدن فلسفه وجودی TypeScript است. وقتی از any استفاده می‌کنید:

  • قابلیت Autocomplete (پیشنهاد کد) ویرایشگر از کار می‌افتد.
  • خطاهای احتمالی در زمان اجرا (Runtime) رخ می‌دهند، نه در زمان توسعه.
  • امنیت کد به شدت کاهش می‌یابد.

نوع داده unknown چیست؟

unknown (به معنای ناشناخته) نوعی تایپ است که در سال ۲۰۱۸ معرفی شد و جایگزین امن‌تری برای any محسوب می‌شود. این نوع داده دقیقاً همان چیزی است که نامش می‌گوید: “من نمی‌دانم این متغیر چه نوعی دارد”.

تفاوت اصلی:

در حالی که any به شما اجازه می‌دهد هر عملیاتی را روی متغیر انجام دهید، unknown این اجازه را نمی‌دهد تا زمانی که نوع آن را برای TypeScript شفاف کنید.

مثال:

let data: unknown = "TypeScript";

// console.log(data.toUpperCase());  خطا: Object is of type 'unknown'.

برای استفاده از این متغیر، باید ابتدا بررسی کنید که آیا نوع آن درست است یا خیر:

if (typeof data === "string") {
  console.log(data.toUpperCase()); //  حالا صحیح است
}

مقایسه کلیدی: Any در برابر Unknown

ویژگیanyunknown
بررسی تایپکاملاً غیرفعال استفعال است و نیاز به تایید دارد
انعطافبسیار زیاد (خطرناک)محدود (ایمن)
عملیات مجازهر عملیاتی مجاز استفقط بررسی‌های منطقی (مانند typeof)
توصیهتا جای ممکن استفاده نشودبرای داده‌های ناشناخته پیشنهاد می‌شود

چه زمانی از کدام استفاده کنیم؟

چه زمانی از unknown استفاده کنیم؟

  • زمانی که داده‌ای از منابع خارجی (مانند پاسخ‌های یک API، ورودی‌های کاربر یا یک فایل JSON) دریافت می‌کنید و پیش از پردازش باید ماهیت آن را بررسی کنید.

چه زمانی از any استفاده کنیم؟

  • در موارد بسیار نادر، مثل زمانی که در حال مهاجرت دادن یک پروژه عظیم JavaScript به TypeScript هستید و هنوز فرصت نکرده‌اید تایپ بخش‌های قدیمی را بنویسید (به عنوان یک راهکار موقت).
  • یا هنگام کار با کتابخانه‌های قدیمی که هیچ‌گونه فایل تایپی (Type Definitions) ندارند.

تکنیک Narrowing (محدودسازی نوع)

هنگام کار با unknown باید از تکنیک‌هایی استفاده کنید تا به TypeScript بفهمانید متغیر دقیقاً چه نوعی دارد:

function processData(input: unknown) {
  if (typeof input === "number") {
    console.log(input.toFixed(2)); // اکنون TypeScript می‌داند ورودی عدد است
  } else if (typeof input === "string") {
    console.log(input.length);     // اکنون TypeScript می‌داند ورودی رشته است
  }
}

جمع‌بندی

در این جلسه یاد گرفتیم که:

  1. any قدرت سیستم تایپ را از بین می‌برد و باید از آن اجتناب کرد.
  2. unknown جایگزین امن و مدرنی است که ما را مجبور می‌کند پیش از استفاده از یک داده ناشناخته، نوع آن را بررسی کنیم.
  3. با استفاده از typeof یا سایر بررسی‌های منطقی (Narrowing)، می‌توانیم داده‌های unknown را به شکل ایمن پردازش کنیم.

دسترسی به ویدیوهای کامل دوره

برای مشاهده ویدیوهای کامل هر جلسه، دریافت تمرین‌ها، فایل‌ها و پشتیبانی، می‌توانید دوره کامل را تهیه کنید.