Typescript Partial<T>,我的一生中你去哪儿了?
天哪,我怎么到现在才知道 Partial 的存在?这是所有 Typescript 开发者都应该知道的。
我将使用基于官方文档的示例...
https://www.typescriptlang.org/docs/handbook/utility-types.html
假设您有一个简单的界面和实例......
interface Todo {
title: string;
description: string;
}
const todo1 = {
title: 'organize desk',
description: 'clear clutter',
};
我们如何编写一个方法来获取我们的 Todo 实例并使用另一个 Todo 的值来更新它?
这个怎么样?
function updateTodo(originalTodo: Todo, fieldsToUpdateTodo: any) {
return { ...originalTodo, ...fieldsToUpdateTodo };
}
const todo2 = updateTodo(todo1, {
description: 'throw out trash',
});
不太好。我们必须将 fieldsToUpdateTodo 的类型设置为any,因为如果是 Todo 的话,我们需要设置 Todo 接口上的所有属性。如果我们只想更新description怎么办?那么就使用any 吧。我想我们可以将 Todo 中的所有属性都标记为可选,但这样一来,我们就会失去很多我们喜欢的类型检查。
如果我们知道我们只想更新描述,事情就更容易了……
function updateTodoDescription(originalTodo: ITodo, description: string) {
return { ...originalTodo, description: description };
}
但是如果我们有许多属性并且想要任意更新属性,这种模式是不可扩展的。
让我们直奔主题。Partial 能帮上什么忙?其实很简单,几乎不会带来什么不便……
function updateTodo(todo: Todo, fieldsToUpdate: Partial<Todo>) {
return { ...todo, ...fieldsToUpdate };
}
将对象包装在 Partial 中会将该对象上的所有属性标记为可选。
然后我们可以像这样调用我们的 updateTodo...
const todo2 = updateTodo(todo1, {
description: 'throw out trash',
});
我们不必设置 Todo 接口中的每个属性。我们的 UpdateTodo 方法可以轻松地使用扩展运算符来合并两个 Todo。
文章来源:https://dev.to/nickraphael/typescript-partial-t-where-have-you-been-my-whole-life-4ig4