类型分配给联合意味着什么?

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 }