流:动态生成字符串联合类型?

时间:2017-02-16 16:38:46

标签: javascript types flowtype

我们说我有一个流类型Suit,我想把它组成另一种名为Card的类型。

// types.js

type Suit =
  | "Diamonds"
  | "Clubs"
  | "Hearts"
  | "Spades";


type Card = {
  ...
  suit: Suit,
  ...
}

不是直接在suit.js中对Suit字符串进行硬编码,而是可以基于JavaScript原语(数组)动态生成Suit类型吗?说...

// constants.js

const SUITS = ['Diamonds', 'Clubs', 'Hearts', 'Spades'];

这样,套装只能定义一次,并且在JavaScript构造内部,可以在应用程序的其他部分重复使用。例如,应用程序中其他位置需要访问所有可用套装的组件:

// component.js

SUITS.map((suit: Suit): void => { ... });

1 个答案:

答案 0 :(得分:2)

实际上可以使用实用程序类型$Keys

const SUITS = {
    Diamonds: 'Diamonds',
    Clubs: 'Clubs',
    Hearts: 'Hearts',
    Spades: 'Spades',
};

type Suit = $Keys<typeof SUITS>

const suit1 : Suit = 'Diamonds'; // OK
const suit2 : Suit = 'Foo'; // Type error

请注意,对于此示例,SUITS中的值实际上并不重要,流将查看SUITS中的键。 type Suit将类似于联合类型type Suit = 'Diamonds' | 'Clubs' | ...