从对象推断值

时间:2019-02-15 16:59:22

标签: typescript

如何从这样的对象中推断所有值……

const fruits = {
  a: 'apple',
  b: 'banana'
};

…以便我得到这个?

type fruitValues = 'apple' | 'banana';

(我想我正在寻找Flow中与$Values<T>相当的商品)

1 个答案:

答案 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

好的,希望能有所帮助。祝你好运!