编程全栈开发人员

在TypeScript中什么是'utility types'(例如,Partial、Required、Pick、Omit),它们在哪里以及如何使用,使用时常见的错误是什么?

用 Hintsage AI 助手通过面试

答案

Utility types是TypeScript中内置的工具,用于基于现有类型进行转换、修改或派生类型。最常见的有:

  • Partial<T>—将类型T的所有属性变为可选
  • Required<T>—将所有属性变为必需
  • Pick<T, K>—从类型T中选择仅有的属性K
  • Omit<T, K>—从类型T中排除属性K

使用示例:

type User = { id: number; name: string; age?: number }; type UserPreview = Pick<User, 'id' | 'name'>; type UserPatch = Partial<User>; type FullUser = Required<User>; type UserWithoutAge = Omit<User, 'age'>;

这使得创建更灵活的API和DTO成为可能。

陷阱问题

如果类型的属性被定义为可选(age?: number),那么Required<T>会表现得怎么样?它会依然保持为可选吗?

**答案:**不,Required<T>将类型T的所有属性,包括可选属性,转换为必需属性。

type User = { age?: number }; type UserRequired = Required<User>; // UserRequired: { age: number }

由于不了解该主题的细微之处而出现的实际错误示例


故事

使用Partial<T>来更新对象,以为这对数据库自动安全。忘记检查字段是否为null/undefined,在更新实体时获得了验证错误。


故事

使用Omit<T, K>来从请求类型中排除技术属性,未考虑在重构模型时新技术字段未被添加到排除列表。结果私有字段通过API "泄漏"。


故事

在共享库中创建了Pick<T, K>类型,错误地列出了键:K在原始类型中部分缺失。TypeScript在使用字面字符串时忽略了错误,但在原始类型发生变化时出现了不一致,导致所有服务中的部分类型 "损坏"。