Typescript-从另一个联合类型的字段的值获取联合类型

时间:2019-08-24 18:26:51

标签: typescript

在Typescript中,是否可以从其他联合类型的字段的值中获取联合类型?

type MyUnionType = 
  | { foo: 'a', bar: 1 }
  | { foo: 'b', bar: 2 } 
  | { foo: 'c', bar: 3 }

// can I generate this automatically? 
// i.e. a union of the possible values of foo in MyUnionType?
type Foos = 'a' | 'b' | 'c'

我希望Pick<MyUnionType, 'foo'>可以做到,但效果不佳-它返回我想要的类型,但嵌套在foo字段下:{ foo: 'a' | 'b' | 'c' }

2 个答案:

答案 0 :(得分:3)

import { ToastProgrammatic as Toast } from 'buefy' Toast.open('Toasty!') works,只要每种类型都有一个type Foos = MyUnionType['foo']字段:

foo

如果您需要通过异构联合类型进行分布,则可以使用以下字段filter向下查找联合中的那些类型:

type MyUnionType = 
  | { foo: 'a', bar: 1 }
  | { foo: 'b', bar: 2 } 
  | { foo: 'c', bar: 3 }

type FooType = MyUnionType['foo']
// FooType = "a" | "b" | "c"

然后您可以use

type PickField<T, K extends string> = T extends Record<K, any> ? T[K] : never;

答案 1 :(得分:0)

Sean Vieira很棒。这是另一种方式,虽然有点冗长:

> lualatex test.tex