سلام دوستان 🖐️
همونطور که میدونیم تایپاسکریپت علاوه بر اینکه اجازه میده که تایپهای مد نظر خودمون رو بسازیم، چند تایپ کاربردی رو ارائه میده که با اونها میتونیم تایپهای موجود رو دستکاری و به یک حالت دیگه تبدیلشون کنیم. به این تایپها که بصورت گلوبال در دسترس هستن میگیم Utility Types که توی این دو قسمت میخوایم با اونها آشنا بشیم.
در حالت معمولی اگه بخوایم یک آبجکت از نوع این تایپ بسازیم، باید همهٔ پراپرتیهای این تایپ رو پیادهسازی کنیم:
const newPost: Post = {
title: 'Hello world!'
}
// Error: Property 'status' is missing
// in type '{ title: string; }'
// but required in type 'Post'
اما با Partial میتونیم پیادهسازی این پراپرتیها رو برای آبجکتمون اختیاری کنیم. در واقع Partial یک تایپ رو میگیره و یک تایپ جدید بهمون برمیگردونه که همهٔ پراپرتیهای اون اختیاری هستن:
این تایپ دقیقاً برعکس تایپ Partial هست. اگه یک تایپ داشته باشیم که بعضی از پراپرتیهای اون اختیاری باشن، با Required میتونیم یک تایپ جدید بسازیم که همهٔ پراپرتیهای اون اجباری هستن:
type Post = {
title?: string;
status?: string;
}
type RequiredPost = <<Required>><Post>;
const post: RequiredPost = {
title: 'Hello'
};
// Error: Property 'status' is missing
// in type '{ title: string; }'
// but required in type 'Required<Post>'
با کمک Readonly میتونیم از یک تایپ موجود یک تایپ جدید بسازیم که همهٔ پراپرتیهای اون Readonly هستن. یعنی اگه آبجکتی این تایپ رو پیادهسازی کنه، پراپرتیهای اون دیگه قابل تغییر نیستن:
type Post = {
title: string;
}
type ReadonlyPost = Readonly<Post>;
const post1: ReadonlyPost = {
title: 'Hello World',
}
post1.title = 'Goodbye World';
// Error: Cannot assign to 'title' because it is a read-only property.
تایپ Pick دو تا ورودی میگیره. ورودی اول تایپ مد نظرمون هست که میخوایم پراپرتیهای اون رو انتخاب کنیم. توی ورودی دوم باید اسم پراپرتیهایی رو بنویسیم که میخوایم توی تایپ جدید حضور داشته باشه. توی کد بالا گفتیم از تایپ Person میخوایم یک تایپ جدید که شامل پراپرتیهای name و age هست داشته باشیم.
اگه یک Union Type داریم و میخوایم بعضی از اعضای اون رو حذف کنیم میتونیم از Exclude استفاده کنیم:
type AllTypes = string | number | Function;
type NoFunc = Exclude<AllTypes, <<Function | Boolean>>>;
// string | number
تایپ Exclude دو تا ورودی میگیره. ورودی اول تایپی هست که میخوایم از اون یک تایپ جدید بسازیم که باید یک Union Type باشه. توی ورودی دوم، تایپهایی که میخوایم حذف کنیم رو به صورت Union Type مشخص میکنیم.
توی کد بالا ما یک تایپ جدید از AllTypes ساختیم که توی اون Function حذف شده. دقت کنید که ما Boolean رو هم مشخص کردیم. اما چون توی AllTypes مقدار Boolean نداشتیم، نادیده گرفته شد. برای اجرای این کد رو ببینید.
اگه تابعی داریم و میخوایم یک تایپ از نوع پارامترهای اون تابع داشته باشیم، Parameters به کمکمون میاد. این تایپ یک ورودی میگیره که باید یک تابع باشه و یک Tuple برمیگردونه که شامل نوعهای پارامتر تابع مد نظرمون هست:
function myFunc(a: string, b: number) {}
type FuncParams = Parameters<typeof myFunc>; // [string, number]
const params: FuncParams = ["Hello", 3];