نکات TypeScript که هر کسی باید بدونه
خلاصهٔ کاملتر
این مقاله یه فهرست منتخب از الگوهای کاربردی TypeScript هست؛ نکاتی که هر کدوم جدا جدا کوچیک به نظر میرسن ولی روی هم به شکل محسوسی حس کار کردن با کد TypeScript رو عوض میکنن. تمرکزش روی ایمنی، خوانایی و قابلیت نگهداریه.
چند تا از مهمترین توصیهها حول اعتماد به استنتاج تایپ (inference) میچرخن. مثلاً بهجای any از unknown استفاده کن تا قبل از کار کردن با داده مجبور به اعتبارسنجی بشی. یا بیش از حد annotation ننویس، چون اغلب تایپ رو پهنتر (wider) میکنه و به استنتاج آسیب میزنه. یکی از مهمترین ویژگیهای مدرن هم satisfies هست که برخلاف as، تطابق با یه تایپ رو بررسی میکنه بدون اینکه استنتاج دقیق رو از دست بدی:
const routes = {
home: "/",
about: "/about",
} satisfies Record<string, string>;یه تغییر نگرش مهم دیگه مشتق گرفتن تایپ از روی مقدار بهجای تکرار دستیشه. مثلاً بهجای اینکه یه آرایهی نقشها رو یه بار به عنوان مقدار و یه بار به عنوان تایپ بنویسی، تایپ رو مستقیم از خود آرایه در میاری تا با گذشت زمان از هم جدا نیفتن:
const roles = ["admin", "user", "guest"] as const;
type Role = (typeof roles)[number];از جایی که TypeScript «معماری» میشه، بحث یونینهای تفکیکشده (discriminated unions) پیش میاد؛ مثل مدل کردن یه state با حالتهای loading، success و error که هر کدوم فیلدهای خودشون رو دارن. این مدل خیلی بهتر از یه آبجکت شل با کلی فیلد اختیاری مقیاس میگیره. کنارش بررسی جامع (exhaustive check) با never قرار میگیره که باعث میشه refactorهای آینده بهجای باگ زمان اجرا، به ارور زمان کامپایل تبدیل بشن.
چند نکتهی دیگه هم مطرح میشه: استفاده از as const برای کانفیگ و ثابتها تا تایپها بهجای string به مقدار دقیق محدود بشن، نوشتن type predicate برای narrowing قابلاستفادهی مجدد، ساختن تایپهای جدید از روی تایپهای موجود با ابزارهایی مثل Pick و Omit، پرهیز از enum در بیشتر موارد به نفع یونینهای literal، و روشن کردن گزینههای strict کامپایلر مثل noUncheckedIndexedAccess.
ولی مهمترین و جمعبندیکنندهترین نکته اینه: «تایپسیف» با «امن در زمان اجرا» یکی نیست. TypeScript پاسخ یه API رو اعتبارسنجی نمیکنه. کدی مثل گرفتن response.json() و زدن as User بهش، راحت کامپایل میشه ولی میتونه سر زمان اجرا بترکه. پس برای دادهای که از مرز بیرونی (مثل API) میاد باید با ابزاری مثل Zod اعتبارسنجی واقعی انجام بدی. TypeScript درستی رو بهتر میکنه، ولی جای اعتبارسنجی، معماری خوب یا حذف باگهای زمان اجرا رو نمیگیره.
نکات کلیدی:
- به استنتاج تایپ اعتماد کن؛ unknown به جای any و کمتر annotation بنویس
- satisfies تطابق رو چک میکنه بدون از دست دادن استنتاج، برخلاف as
- تایپ رو از روی مقدار مشتق بگیر تا داده و تایپ از هم جدا نیفتن
- یونینهای تفکیکشده بهعلاوهی never، refactor رو امنتر میکنن
- تایپسیف بودن امنیت زمان اجرا نیست؛ دادهی مرزی رو واقعاً اعتبارسنجی کن




