TypeScript附带了一组内置实用类型,将现有类型转换为新形状。大多数TypeScript开发者知道其中两三个;完整集合确实很有用。以下是值得使用的那些。
基本类型
`Partial`:使T的所有属性变为可选。`Required`:使T的所有属性变为必需(Partial的逆)。`Readonly`:使T的所有属性变为只读——对定义不可变数据形状很有用。`Record`:创建一个键类型为Keys、值类型为Type的对象类型。常见用法:`Record`用于字符串键数字映射;`Record<"north" | "south" | "east" | "west", boolean>`用于方向标志对象。`Pick`:通过从T中选择一组属性Keys来创建类型。`Omit`:通过省略T中的一组属性Keys来创建类型。Pick的逆。`Exclude`:对于联合类型——从T中删除可分配给U的类型。`Extract`:对于联合类型——从T中提取可分配给U的类型(Exclude的逆)。`NonNullable`:从T中删除null和undefined。`ReturnType`:提取函数类型T的返回类型。当你需要函数的返回类型但没有单独的类型定义时非常有用。`Parameters`:将函数类型T的参数提取为元组。`InstanceType`:提取构造函数类型的实例类型。
实际应用
`Partial`用于更新函数:当编写更新记录的函数时,输入通常应该允许部分更新——`function updateUser(id: string, changes: Partial)`。当你想确保至少有一个字段存在时,比`Partial`更精确:与`Required>`结合。`Omit`用于DTO:当你的API响应类型不应该包含内部数据模型中的某些字段时——`type UserDTO = Omit`。`Record`用于类型安全映射:当你有一组固定键并希望对所有值进行类型安全时——`type FeatureFlags = Record`,其中FeatureName是字符串字面量联合。`ReturnType`用于派生类型:当你想要没有单独类型声明的函数的返回类型时——`type ApiResponse = ReturnType`。这在函数实现和从中派生的类型之间建立了紧密耦合。`Extract`和`Exclude`用于可辨别联合:当你有联合类型并需要进一步收窄它时——`type SuccessAction = Extract`。带infer的条件类型:更高级的实用类型模式涉及条件类型和`infer`关键字——`type UnwrapPromise = T extends Promise ? U : T`提取Promise解析为的类型。
模板字面量类型
不太为人所知但确实有用:TypeScript 4.1+模板字面量类型允许从字符串字面量联合构建字符串类型。`type EventName = \`on${Capitalize}\“创建以”on”开头后跟大写字母字符串的字符串类型。`type Getters = { [K in keyof T as \`get${Capitalize}\`]: () => T[K] }`从任何对象类型创建getter类型。用途:定义CSS属性名、HTTP头名、事件处理程序名或其他具有系统结构的字符串模式。