نوع های کمکی (Utility) در تایپ اسکریپت [TypeScript]

نوع های کمکی utility در تایپ اسکریپت

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 استفاده کنید.


کامنت ها