Utility types是TypeScript中内置的工具,用于基于现有类型进行转换、修改或派生类型。最常见的有:
Partial<T>—将类型T的所有属性变为可选Required<T>—将所有属性变为必需Pick<T, K>—从类型T中选择仅有的属性KOmit<T, K>—从类型T中排除属性Ktype 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在使用字面字符串时忽略了错误,但在原始类型发生变化时出现了不一致,导致所有服务中的部分类型 "损坏"。