TypeScript 提供了一些工具性质的类型定义来不便开发人员进行一些通用的类型定义。Partial 是其中之一。

看个例子:

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',});

这种形式不是很好,因为如果咱们只想更新 description 属性,就不可能将 fieldsToUpdateTodo 的类型定义成 Todo,否则咱们还得为第二个参数指定 title 属性。因而咱们将 updateTodo 的第二个参数类型指定成 any,这样就失去了类型查看。

同样的,如果咱们把 interface Todo 的属性设置成 optional,则第二个参数的类型能够定义成 Todo,然而 optional 属性同样失去了类型查看。

应用 Partial 能够完满解决这个问题。

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

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

而后咱们能够像这样调用咱们的 updateTodo...

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

咱们不会被迫从 Todo 界面设置每个属性。咱们的 UpdateTodo 办法而后能够欢快地应用扩大运算符来合并两个 Todo。