T

Typescript Partial<T>,我的一生中你去哪儿了?

2025-05-25

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',
};
Enter fullscreen mode Exit fullscreen mode

我们如何编写一个方法来获取我们的 Todo 实例并使用另一个 Todo 的值来更新它?

这个怎么样?

function updateTodo(originalTodo: Todo, fieldsToUpdateTodo: any) {
    return { ...originalTodo, ...fieldsToUpdateTodo };
}

const todo2 = updateTodo(todo1, {
    description: 'throw out trash',
});
Enter fullscreen mode Exit fullscreen mode

不太好。我们必须将 fieldsToUpdateTodo 的类型设置为any,因为如果是 Todo 的话,我们需要设置 Todo 接口上的所有属性。如果我们只想更新description怎么办?那么就使用any 吧。我想我们可以将 Todo 中的所有属性都标记为可选,但这样一来,我们就会失去很多我们喜欢的类型检查。

如果我们知道我们只想更新描述,事情就更容易了……

function updateTodoDescription(originalTodo: ITodo, description: string) {
    return { ...originalTodo, description: description };
}
Enter fullscreen mode Exit fullscreen mode

但是如果我们有许多属性并且想要任意更新属性,这种模式是不可扩展的。

让我们直奔主题。Partial 能帮上什么忙?其实很简单,几乎不会带来什么不便……

function updateTodo(todo: Todo, fieldsToUpdate: Partial<Todo>) {
    return { ...todo, ...fieldsToUpdate }; 
}
Enter fullscreen mode Exit fullscreen mode

将对象包装在 Partial 中会将该对象上的所有属性标记为可选。

然后我们可以像这样调用我们的 updateTodo...

const todo2 = updateTodo(todo1, {
    description: 'throw out trash',
});
Enter fullscreen mode Exit fullscreen mode

我们不必设置 Todo 接口中的每个属性。我们的 UpdateTodo 方法可以轻松地使用扩展运算符来合并两个 Todo。

文章来源:https://dev.to/nickraphael/typescript-partial-t-w​​here-have-you-been-my-whole-life-4ig4
PREV
2022 年前端开发者资源
NEXT
使用 Django 和 React 的 Python 聊天教程