类型分配给联合意味着什么?
What does it mean for a type to distribute over unions?
我正在阅读一篇文章:"Unionize and Objectify: A Trick for Applying Conditional Types to Objects"
In TypeScript our most powerful tool is conditional types. This is
because they have two unique abilities:
- They distribute over unions.
- They enable you to use the infer keyword.
'distribute over unions' 在一般情况下和在这种情况下是什么意思?
术语分布式指的是在进行类型级操作(例如keyof
或映射类型)时应如何处理联合类型。
- 非分配(默认) 操作应用于存在于联合的每个成员上的属性。
- 分布式 操作分别应用于联合的所有成员。
让我们举个例子。
type Fruit =
| { species: 'banana', curvature: number }
| { species: 'apple', color: string }
假设出于某种原因,您想知道 Fruit
.
上可能存在的所有可能的键
非分配
您的直觉可能会告诉您这样做:
type KeyOfFruit = keyof Fruit; // "species"
但是,这只会为您提供存在于联合体每个成员上的属性。在我们的示例中,species
是所有 Fruit
.
共享的唯一公共 属性
这与将 keyof
应用于两种类型的联合是一样的。
keyof ({ species: 'banana', curvature: number } | { species: 'apple', color: string })
分布式
通过分发,不对 仅 公共属性执行操作。相反,它是在 工会的每个成员上单独完成的 。然后将结果相加。
type DistributedKeyOf<T> =
T extends any
? keyof T
: never
type KeyOfFruit = DistributedKeyOf<Fruit>; // "species" | "curvature" | "color"
在这种情况下,TypeScript 将 keyof
应用于联合的每个成员,并对结果求和。
keyof { species: 'banana', curvature: number } | keyof { species: 'apple', color: string }
我正在阅读一篇文章:"Unionize and Objectify: A Trick for Applying Conditional Types to Objects"
In TypeScript our most powerful tool is conditional types. This is because they have two unique abilities:
- They distribute over unions.
- They enable you to use the infer keyword.
'distribute over unions' 在一般情况下和在这种情况下是什么意思?
术语分布式指的是在进行类型级操作(例如keyof
或映射类型)时应如何处理联合类型。
- 非分配(默认) 操作应用于存在于联合的每个成员上的属性。
- 分布式 操作分别应用于联合的所有成员。
让我们举个例子。
type Fruit =
| { species: 'banana', curvature: number }
| { species: 'apple', color: string }
假设出于某种原因,您想知道 Fruit
.
非分配
您的直觉可能会告诉您这样做:
type KeyOfFruit = keyof Fruit; // "species"
但是,这只会为您提供存在于联合体每个成员上的属性。在我们的示例中,species
是所有 Fruit
.
这与将 keyof
应用于两种类型的联合是一样的。
keyof ({ species: 'banana', curvature: number } | { species: 'apple', color: string })
分布式
通过分发,不对 仅 公共属性执行操作。相反,它是在 工会的每个成员上单独完成的 。然后将结果相加。
type DistributedKeyOf<T> =
T extends any
? keyof T
: never
type KeyOfFruit = DistributedKeyOf<Fruit>; // "species" | "curvature" | "color"
在这种情况下,TypeScript 将 keyof
应用于联合的每个成员,并对结果求和。
keyof { species: 'banana', curvature: number } | keyof { species: 'apple', color: string }