联合类型的所有可能键

时间:2018-03-21 08:56:17

标签: typescript

我希望得到一个联合类型的所有可用键。

interface Foo {
  foo: string;
}

interface Bar {
   bar: string;
}

type Batz = Foo | Bar;

type AvailableKeys = keyof Batz;

我希望将'foo' | 'bar'作为AvailableKeys的结果,但它是never(作为替代,我可以做keyof (Foo & Bar),什么产生了所需类型,但我想要避免重复类型)。

我在github找到了问题keyof union type should produce union of keys。我理解答案,keyof UnionType不应生成所有可能的密钥。

所以我的问题是:是否有其他方法可以获得所有可能的密钥列表(如果需要tsc的verison 2.8,那就没问题了?)

2 个答案:

答案 0 :(得分:4)

这可以在使用条件类型的typescript 2.8及更高版本中完成。条件类型迭代联合中的类型,结合结果:

type Batz = Foo | Bar;

type KeysOfUnion<T> = T extends any ? keyof T: never;
// AvailableKeys will basically be keyof Foo | keyof Bar 
// so it will be  "foo" | "bar"
type AvailableKeys = KeysOfUnion<Batz>; 

简单keyof Union不起作用的原因是因为keyof总是返回类型的可访问键,如果联合只是公共键。 KeysOfUnion中的条件类型实际上将接受union的每个成员并获取其键,因此结果将是keyof的并集应用于union中的每个成员。

答案 1 :(得分:0)

您需要一个交集类型:

,而不是联合类型
type Batz = Foo & Bar;

我同意他们的命名有时会令人困惑。