Typescript
着重记录 Typescript 类型相关的笔记。
常见内置工具泛型
Partial<T>
将类型 T
的所有属性转为可选项:
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<T>
将类型 T
所有属性变为必选的:
interface Props {
a?: number;
b?: string;
}
const obj: Props = { a: 5 }; // OK
const obj2: Required<Props> = { a: 5 }; // Error: property 'b' missing
Omit<T,K>
从类型 T
从中移除 K
属性:
interface Todo {
title: string;
description: string;
completed: boolean;
}
// 多个属性用 | 分隔
type TodoPreview = Omit<Todo, "description" | "completed">;
const todo: TodoPreview = {
title: "Clean room",
};
Pick<T,K>
将类型 T
中提取出 K
属性来构造一个新类型:
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = Pick<Todo, "title" | "completed">;
const todo: TodoPreview = {
title: "Clean room",
completed: false,
};
Readonly<T>
将类型 T
的所有属性都设为 readonly
,也就是说使用该泛型后就只能读不能写。
interface Todo {
title: string;
}
const todo: Readonly<Todo> = {
title: "Todo",
};
// 改不得
todo.title = "Hello"; // Error: cannot reassign a readonly property
特殊场景
移除函数首位参数: 在做闭包或者柯里化时可以考虑以下做法:
export type RemoveFirst<T extends any[]> = T extends [any, ...infer Rest]
? Rest
: never;
export type OmitFirstParamFunction<F extends (...args: any) => any> = (
...args: RemoveFirst<Parameters<F>>
) => ReturnType<F>;
在 JavaScript 项目中使用 TypeScript
参考资料: