挑战

有时,你可能想要根据联合类型中的属性查找类型。

在这个挑战中,我们想要在联合类型Cat | Dog中通过查找通用的type字段获得相应的 类型。

换句话说,在接下来的例子中我们希望通过LookUp<Dog | Cat, 'dog'>得到Dog类型, 通过LookUp<Dog | Cat, 'cat'> 得到Cat类型。

interface Cat {
  type: "cat";
  breeds: "Abyssinian" | "Shorthair" | "Curl" | "Bengal";
}

interface Dog {
  type: "dog";
  breeds: "Hound" | "Brittany" | "Bulldog" | "Boxer";
  color: "brown" | "white" | "black";
}

type MyDogType = LookUp<Cat | Dog, "dog">; // expected to be `Dog`

解答

一开始我以为现在这个解答将会有着大量的解释说明,但事实证明并没有什么与众不同。

我们知道可以利用 TypeScript 中 的条件类型来 检查类型是否可分配给某些特定布局(如果我可以这么说的话)。

然后让我们来检查U是否可以赋值给{ type: T }

type LookUp<U, T> = U extends { type: T } ? U : never;

顺便提一下,值得注意的是,条件类型在 TypeScript 中是分布式的,因此联合类型中的每 个成员都将按照我们的条件进行检查。

参考