نوع های کمکی (Utility) در تایپ اسکریپت [TypeScript]
منبع: https://rasanika.com
TypeScript چندین نوع ابزاری و کمکی را برای تسهیل تبدیل نوع های رایج فراهم می کند. این در این پست با برخی از این ابزار آشنا می شویم.
این مقاله بخشی از سری آموزشی تایپ اسکریپت است. برای مشاهده بقیه بخش ها، فهرست مقالات را ببینید.
نوع Awaited<Type>
این نوع کمکی برای استخراج نوع بازگشتی یک promise
استفاده می شود. مثال:
async function fetchName () {
...
return 'Reza';
}
const name = fetchName();
type A = typeof name; // A = Promise<string>
type B = Awaited<typeof name>; // B = string
نوع Partial<Type>
یک نوع از روی نوع آبجکت ایجاد می کند که همه ویژگی های آن اختیاری هستند. مثال:
interface Todo {
title: string;
description: string;
}
function updateTodo(todo: Todo, fieldsToUpdate: Partial<Todo>) {
return { ...todo, ...fieldsToUpdate };
}
const todo1 = {
title: "organize desk",
description: "clear clutter",
};
const todo2 = updateTodo(todo1, {
description: "throw out trash",
});
نوع Required<Type>
یک نوع از روی نوع آبجکت ایجاد و همه ویژگی های اختیاری را تبدیل به ویژگی ضروری می کند. مثال:
interface Props {
a?: number;
b?: string;
}
const obj: Props = { a: 5 };
const obj2: Required<Props> = { a: 5 }; // خطا! b ضروری است!
نوع Readonly<Type>
همه ویژگی های یک نوع را تبدیل به فقط خواندنی (readonly) می کند. مثال:
interface Todo {
title: string;
}
const todo: Readonly<Todo> = {
title: "Delete inactive users",
};
todo.title = "Hello"; // خطا! این ویژگی قابل نوشتن نیست
نوع Record<Keys, Type>
یک نوع آبجکت می سازد که کلیدهای ویژگی آن Keys
و مقادیر ویژگی آن Type
هستند. مثال:
interface CatInfo {
age: number;
breed: string;
}
type CatName = "miffy" | "boris" | "mordred";
const cats: Record<CatName, CatInfo> = {
miffy: { age: 10, breed: "Persian" },
boris: { age: 5, breed: "Maine Coon" },
mordred: { age: 16, breed: "British Shorthair" },
};
cats.boris; // const cats: Record<CatName, CatInfo>
نوع Pick<Type, Keys>
از نوع آبجکت Type
فقط ویژگی هایی که در union رشته ای Keys
مشخص کرده ایم را بر می دارد. مثال:
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = Pick<Todo, "title" | "completed">;
const todo: TodoPreview = {
title: "Clean room",
completed: false,
};
todo; // const todo: TodoPreview
نوع Omit<Type, Keys>
از نوع آبجکت Type
همه ویژگی ها به جز آنهایی که در union رشته ای Keys
مشخص کرده ایم را بر می دارد. مثال:
interface Todo {
title: string;
description: string;
completed: boolean;
createdAt: number;
}
type TodoPreview = Omit<Todo, "description">;
const todo: TodoPreview = {
title: "Clean room",
completed: false,
createdAt: 1615544252770,
};
todo; // const todo: TodoPreview
نوع Exclude<UnionType, ExcludedMembers>
از نوع UnionType
همه اعضایی که در ExcludedMembers
مشخص کرده ایم را حذف می کند. مثال:
type T0 = Exclude<"a" | "b" | "c", "a">; // T0 = "b" | "c"
type T1 = Exclude<"a" | "b" | "c", "a" | "b">; // T1 = "c"
نوع Extract<Type, Union>
از نوع Type
همه نوع های ممکنی که در Union
مشخص کرده ایم را بر می دارد. مثال:
type T0 = Extract<"a" | "b" | "c", "a" | "f">; // T0 = "a"
type T1 = Extract<string | number | (() => void), Function>; // T1 = () => void
نوع NonNullable<Type>
از نوع Type
نوع های null
و undefined
را حذف می کند. مثال:
type T0 = NonNullable<string | number | undefined>; // T0 = string | number
نوع Parameters<Type>
یک نوع چندتایی (tuple) یا آرایه از پارامتر های نوع تابع Type
می سازد. مثال:
declare function f1(arg: { a: number; b: string }): void;
type T0 = Parameters<() => string>; // T0 = []
type T1 = Parameters<(s: string) => void>; // T1 = [s: string]
type T2 = Parameters<<T>(arg: T) => T>; // T2 = [arg: unknown]
type T3 = Parameters<typeof f1>; // T3 = [arg: { a: number; b: string }]
type T4 = Parameters<(s: string) => void>[0]; // T4 = string
type T5 = Parameters<string>; // خطا!
نوع ConstructorParameters<Type>
یک نوع چندتایی (tuple) یا آرایه از نوع constructor یک تابع می سازد . مثال:
type T0 = ConstructorParameters<ErrorConstructor>; // T0 = [message?: string]
type T1 = ConstructorParameters<FunctionConstructor>; // T1 = string[]
type T2 = ConstructorParameters<RegExpConstructor>; // T2 = [pattern: string | RegExp, flags?: string]
نوع ReturnType<Type>
یک نوع بر اساس خروجی نوع تابع Type
می سازد. مثال:
declare function f1(): { a: number; b: string };
type T0 = ReturnType<() => string>; // T0 = string
type T1 = ReturnType<(s: string) => void>; // T1 = void
type T2 = ReturnType<<T>() => T>; // T2 = unknown
type T3 = ReturnType<<T extends U, U extends number[]>() => T>; // T3 = number[]
type T4 = ReturnType<typeof f1>; // T4 = { a: number; b: string }
type T5 = ReturnType<any>; // T5 = any
نوع InstanceType<Type>
یک نوع از روی instance یک تابع constructor می سازد. مثال:
class C {
x = 0;
y = 0;
}
type T0 = InstanceType<typeof C>; // T0 = C
نوع ThisParameterType<Type>
نوع پارامتر this
یک تابع را بر می دارد. اگر تابع this
نداشت unknown
بر می گرداند. مثال:
function toHex(this: Number) {
return this.toString(16);
}
function numberToString(n: ThisParameterType<typeof toHex>) {
return toHex.apply(n);
}
نوع OmitThisParameter<Type>
نوع تابع Type
را بدون پارامتر this
بر می گرداند. اگر this نداشت، همان Type
را بر می گرداند. مثال:
function toHex(this: Number) {
return this.toString(16);
}
const fiveToHex: OmitThisParameter<typeof toHex> = toHex.bind(5);
console.log(fiveToHex());
نوع های کمکی برای تغییر نوع رشته
برای کمک به ساخت نوع های template literal این نوع های utility در تایپ اسکریپت وجود دارند:
نوع Uppercase<StringType>
همه کاراکتر های رشته را تبدیل به حروف بزرگ می کند. مثال:
type Greeting = "Hello, world"
type ShoutyGreeting = Uppercase<Greeting> // ShoutyGreeting = "HELLO, WORLD"
type ASCIICacheKey<Str extends string> = `ID-${Uppercase<Str>}`
type MainID = ASCIICacheKey<"my_app"> // MainID = "ID-MY_APP"
نوع Lowercase<StringType>
همه کاراکتر های رشته را تبدیل به حروف کوچک می کند. مثال:
type Greeting = "Hello, world"
type QuietGreeting = Lowercase<Greeting> // QuietGreeting = "hello, world"
type ASCIICacheKey<Str extends string> = `id-${Lowercase<Str>}`
type MainID = ASCIICacheKey<"MY_APP"> // MainID = "id-my_app"
نوع Capitalize<StringType>
اولین حرف یک رشته را تبدیل به حرف بزرگ می کند. مثال:
type LowercaseGreeting = "hello, world";
type Greeting = Capitalize<LowercaseGreeting>; // Greeting = "Hello, world"
نوع Uncapitalize<StringType>
اولین حرف یک رشته را تبدیل به حرف کوچک می کند. مثال:
type UppercaseGreeting = "HELLO WORLD";
type UncomfortableGreeting = Uncapitalize<UppercaseGreeting>; // UncomfortableGreeting = "hELLO WORLD"
قدم بعدی
در این مطلب با برخی از نوع های کمکی Utility در تایپ اسکریپت آشنا شدیم. در ادامه می توانید مقالات بعدی آموزش تایپ اسکریپت را مطالعه کنید. همچنین می توانید آموزش های پروژه محور مرتبط با تایپ اسکریپت را هم بررسی کنید.
برای یادگیری بهتر، علاوه بر مطالعه و تحقیق، سعی کنید تمرینات پروژه محور هم انجام دهید.
برای تست کد تایپ اسکریپت در مرورگر هم می توانید از TS Playground استفاده کنید.