Skip to main content

Utility Types

https://www.typescriptlang.org/docs/handbook/utility-types.html

Awaited<Type>

ใช้ Awaited<Type> สำหรับการถอด Promise Type ออกมา และสามารถถอดแบบ Recursive ลึกจนถึง Value ได้

type A = Awaited<Promise<string>>;
// type A = string

type B = Awaited<Promise<Promise<number>>>;
// type B = number

type C = Awaited<boolean | Promise<number>>;
// type C = boolean | number

Partial<Type>

ทำให้ทุก Property ของ Type เป็น optional value;

interface Todo {
title: string;
description: string;
}

type PartialTodo = Partial<Todo>;

// type PartialTodo = {
// title?: string | undefined;
// description?: string | undefined;
// }

Required<Type>

ทำให้ทุก Property ของ Type เป็น required value

interface Todo {
title?: string;
description?: string;
}

type RequiredTodo = Required<Todo>;

// type RequiredTodo = {
// title: string;
// description: string;
// }

Readonly<Type>

ทำให้ทุก Property ของ Type เป็น readonly (const) ไม่สามารถแก้ไขค่าได้

interface Todo {
title: string;
}

type ReadonlyTodo = Readonly<Todo>;

// type ReadonlyTodo = {
// readonly title: string;
// }

// Example

const todo: ReadonlyTodo = {
title: "Delete inactive users",
};

todo.title = "Hello"; // ❌ Error: Cannot assign to 'title' because it is a read-only property

เราสามารถใช้ as const เพื่อทำให้เป็น readonly ได้เหมือนกัน (Only Type Assertion) อ่านเพิ่มที่

ถ้าเราอยากให้ Error ที่ Run time แนะนำให้ใช้ Object.freeze(obj) เช่น

function freeze<Type>(obj: Type): Readonly<Type> {
return Object.freeze(obj);
}

const todo = {
title: 'Running'
};

const freezedTodo = freeze(todo);

freezedTodo.title = 'Lazy'; // ❌ Type Error and Error at run time

Record<Keys, Type>

const nameRecord: Record<string, number> = {
john: 1,
micky: 2,
};

nameRecord['Lilly'] = 5; // We can add new property in object becuase 'Lilly' is string

nameRecord[true] = 5; // ❌ Error: Type 'true' cannot be used as an index type

Pick<T, Keys>

เลือกบาง Property ออกมาจาก Object

interface Todo {
title: string;
description: string;
completed: boolean;
}

type PickTodo = Pick<Todo, 'title' | 'completed'>;

// type PickTodo = {
// title: string;
// completed: boolean;
// }

Omit<Type, Keys>

ลบบาง Property จาก Object

interface Todo {
title: string;
description: string;
completed: boolean;
}

type OmitTodo = Omit<Todo, 'description'>;

// type OmitTodo = {
// title: string;
// completed: boolean;
// }