Type Lookup
挑战
有时,你可能想要根据联合类型中的属性查找类型。
在这个挑战中,我们想要在联合类型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 中是分布式的,因此联合类型中的每 个成员都将按照我们的条件进行检查。
评论