使用数组值作为类型的流

时间:2019-02-20 02:15:12

标签: javascript flowtype

我有一个数组,值:

const currencies = ['USD', 'BRL', 'EUR']
// The true array has more then 15 currencies values

我想避免这样做以避免代码重复:

type Currencies = 'USD' | 'BRL' | 'EUR'

是否可以将这些值用作类型?我尝试这样做:

type Currencies = $Values<currencies>

但是我出错了,因为$ Values仅用于对象。

不重复代码的最佳方法是什么,因为我已经在数组中包含这些值了。

2 个答案:

答案 0 :(得分:1)

据我所知,目前尚无法使用数组使用流进行此操作。

一种方法是将数组转换为对象,并将$Keystypeof一起使用

const currencies = ['USD', 'BRL', 'EUR'];
const currenciesObj = currencies.reduce((agg, next) => ({...agg, [next]: true}), {});

type Currencies = $Keys<typeof currenciesObj>;

答案 1 :(得分:0)

Jamie的版本将创建另一个对象currenciesObj,该对象只是出于类型目的而创建的,并且即使在最小化代码的同时删除了类型也将保留在代码中。

下面是不需要创建新对象的代码。

const xs: Array<'hi' | 'bye'> = ['hi', 'bye'];

type ArrayValues<TArr> = $Call<<T>(Array<T>) => T, TArr>;

("hi": ArrayValues<typeof xs>); // OK
("foo": ArrayValues<typeof xs>); // ERROR, "foo" not in 'hi' | 'bye'
(1: ArrayValues<typeof xs>); // ERROR, number is incompatible with string