Dùng mapped type iterate qua tất cả keys của T, thêm ? để optional.
typescript
// Partial<T>: tất cả optional
type MyPartial<T> = {
[K in keyof T]?: T[K];
};
// Required<T>: dấu - xóa optional modifier
type MyRequired<T> = {
[K in keyof T]-?: T[K];
};
// Readonly<T>
type MyReadonly<T> = {
readonly [K in keyof T]: T[K];
};
// Pick<T, K>
type MyPick<T, K extends keyof T> = {
[P in K]: T[P];
};
// Record<K, V>
type MyRecord<K extends keyof any, V> = {
[P in K]: V;
};
// Kiểm tra
type User = { id: number; name: string; email?: string };
type PartialUser = MyPartial<User>;
// { id?: number; name?: string; email?: string }Hiểu cách này giúp tạo custom utility types bất kỳ.