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

Jon*_*rsi 14 javascript types flowtype

假设我有一个流类型Suit,我想把它组成另一个叫做的类型Card.

// types.js

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


type Card = {
  ...
  suit: Suit,
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

// constants.js

const SUITS = ['Diamonds', 'Clubs', 'Hearts', 'Spades'];
Run Code Online (Sandbox Code Playgroud)

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

// component.js

SUITS.map((suit: Suit): void => { ... });
Run Code Online (Sandbox Code Playgroud)

Wie*_*ema 4

这实际上可以使用实用程序类型$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
Run Code Online (Sandbox Code Playgroud)

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