如何从这样的对象中推断所有值……
const fruits = {
a: 'apple',
b: 'banana'
};
…以便我得到这个?
type fruitValues = 'apple' | 'banana';
(我想我正在寻找Flow中与$Values<T>
相当的商品)
答案 0 :(得分:4)
您可以从对象推断类型,但是已经推断出该对象仅包含string
属性。也就是说,如the relevant GitHub issue中所述,类型"apple"
和"banana"
已扩展到string
,因为它们不是{{1 }}属性。
readonly
因此,上面的const fruits = {
a: 'apple',
b: 'banana'
};
type FruitValues = (typeof fruits)[keyof typeof fruits]; // string
不是您想要的。如果您想靠近,则需要防止扩大。一种方法是使用冗余但独立的type assertions:
FruitValues
另一种方法是制作一个辅助函数来推断更窄的类型:
const fruits = {
a: 'apple' as 'apple',
b: 'banana' as 'banana'
};
type FruitValues = (typeof fruits)[keyof typeof fruits]; // "apple" | "banana"
最后,一旦TypeScript 3.4着陆,就会const
contexts推断出最窄的类型(包括使所有可能不需要的属性// put in a library somewhere
type Narrowable = string | number | boolean | undefined | null | void | {};
const narrowObj = <V extends Narrowable, T extends { [k: string]: V }>(t: T) => t;
const fruits = narrowObj({
a: 'apple',
b: 'banana'
})
type FruitValues = (typeof fruits)[keyof typeof fruits]; // "apple" | "banana"
),如下所示:>
readonly
好的,希望能有所帮助。祝你好运!