我希望得到一个联合类型的所有可用键。
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,那就没问题了?)
答案 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;
我同意他们的命名有时会令人困惑。