主要观点:作者在休假一年后加入 Salto 工程团队并开始学习 TypeScript,在 Salto 的开源核心业务逻辑库 lowerdash 中发现了 OneOf
类型,用于表达互斥属性,作者深入研究了 OneOf
及其相关的 AllowOnly
、Pick
和 Omit
等类型的实现原理,包括它们的类型定义、工作原理和语言特性使用等,并分享了研究过程和结果,还提供了相关的源代码链接和学习资源。
关键信息:
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 库、实现自定义
Pick
和Omit
类型的文章、索引签名和分布式条件类型的相关文档等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。