这种 TypeScript 类型萦绕在我的梦中

主要观点:作者在休假一年后加入 Salto 工程团队并开始学习 TypeScript,在 Salto 的开源核心业务逻辑库 lowerdash 中发现了 OneOf 类型,用于表达互斥属性,作者深入研究了 OneOf 及其相关的 AllowOnlyPickOmit 等类型的实现原理,包括它们的类型定义、工作原理和语言特性使用等,并分享了研究过程和结果,还提供了相关的源代码链接和学习资源。

关键信息:

  • OneOf 类型使 TreeNode 必须恰好有列出的属性之一,要么是 value 要么是 children
  • AllowOnly<T, K> 接受任意类型和该类型的子集键,创建只允许这些键设置的新类型。
  • Pick<T, K> 创建类似 T 但只包含 K 中指定键的类型,Omit<T, K> 则相反,创建类似 T 但不包含 K 中指定键的类型。
  • 条件类型(如 extends)在类型定义中用于根据条件选择不同的类型,分布式条件类型(如 OneOf 中的使用)会对联合类型中的每个类型分别进行条件判断。
  • 索引签名(如 [Key in K]: T[Key])用于创建映射类型,通过遍历类型中的键并映射到新的类型。

重要细节:

  • OneOf 的实现代码为 export type OneOf<T, K = keyof T> = K extends keyof T? AllowOnly<T, K>: never,通过条件类型和 AllowOnly 实现互斥属性的表达。
  • AllowOnly 的实现代码为 export type AllowOnly<T, K extends keyof T> = Pick<T, K> & { [P in keyof Omit<T, K>]?: never },是 Pick 和对 Omit 处理结果的交集。
  • Pick 的实现代码为 type Pick<T, K extends keyof T> = { [Key in K]: T[Key] },通过遍历指定的键并映射到原类型的对应属性来创建新类型。
  • Omit 的实现代码为 type Omit<T,K extends keyof T> = { [Key in keyof T as Key extends K? never : Key] : T[Key] },通过条件判断保留或删除类型中的键。
  • 提供了相关的源代码链接和学习资源,如 Salto 的 lowerdash 库、实现自定义 PickOmit 类型的文章、索引签名和分布式条件类型的相关文档等。
阅读 32
0 条评论