Utility Types در TypeScript: کاربردهای واقعی
خلاصهٔ کاملتر
Utility type در TypeScript یعنی یه تایپ که تایپ دیگهای رو به عنوان ورودی میگیره و یه تایپ جدید برمیگردونه — مثل تابع، ولی روی تایپها. مثلاً Uppercase تمام رشتههای داخل Name رو به حروف بزرگ تبدیل میکنه. این مقاله نشون میده که تیم Budibase چطور از این ابزارها در کد واقعی استفاده میکنه.
Partial پرکاربردترین utility type در کدبیس Budibaseه و تمام فیلدهای یه تایپ رو optional میکنه. یه کاربرد مهمش در endpointهای بهروزرسانی (PATCH) هست؛ به جای اینکه یه تایپ کاملاً جدید با فیلدهای optional بنویسی، میشه نوشت interface UpdateAppRequest extends Partial {} و تمام. هر بار که فیلد جدیدی به App اضافه بشه، این تایپ هم بهروز میشه.
ترکیب Partial هم کاربرد جالبی داره. وقتی میخوای یه mapping بین مقادیر یه union type و یه مقدار دیگه بسازی، ولی لازم نیست همهی کلیدها وجود داشته باشن، این ترکیب هم type safety رو حفظ میکنه هم انعطاف میده. مثلاً اگه کلید رو اشتباه تایپ کنی، TypeScript خطا میده.
یه نکتهی مهم دربارهی Partial: فقط یه لایه عمق داره. اگه داخل تایپت یه آبجکت تو در تو باشه، فیلدهای اون آبجکت optional نمیشن. برای این مشکل، تیم Budibase یه تایپ سفارشی نوشته:
export type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]
}این تایپ به صورت بازگشتی تمام لایههای آبجکت رو optional میکنه. به عنوان جایگزین، کتابخونهی ts-toolbelt هم همین قابلیت رو با O.Partial ارائه میده.
Omit فیلدهایی رو از یه تایپ حذف میکنه. در Budibase از این برای ساختن تایپ رکوردهایی استفاده میشه که هنوز به دیتابیس ذخیره نشدن و طبیعتاً id ندارن. مثلاً پارامتر تابع create به جای ViewV2 از Omit استفاده میکنه.
ReturnType نوع خروجی یه تابع رو برمیگردونه. یه کاربرد هوشمندانهاش حل تفاوت بین مرورگر و Node.jsه: setTimeout در مرورگر یه number برمیگردونه ولی در Node.js یه Timeout. با نوشتن let timeout: ReturnType دیگه لازم نیست نگران محیط اجرا باشی و کد در هر دو جا درست کار میکنه.
نکات کلیدی:
- Utility typeها مثل تابع روی تایپها عمل میکنن و خروجیشون یه تایپ جدیده
- Partial همهی فیلدها رو optional میکنه؛ ایدهآل برای endpointهای PATCH
- Partial برای mappingهایی که نیازی به پوشش همهی کلیدها ندارن
- Partial فقط یه لایه عمق داره؛ برای آبجکتهای تو در تو از DeepPartial استفاده کن
- Omit برای حذف فیلدهایی مثل id در رکوردهای ذخیرهنشده کاربرد داره
- ReturnType مشکل ناسازگاری تایپ بین مرورگر و Node.js رو حل میکنه




