2017-02-16 83 views
13

比方说,我有一个流量类型Suit,我想将它组合成另一种类型,称为Card流动:动态生成字符串联合类型?

// types.js 

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


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

而不是硬编码在直接suit.js在西服字符串,是否有可能动态地生成基于一个JavaScript原语(阵列)的Suit类型?说...

// constants.js 

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

这种方式西服只能定义一次,并在一个JavaScript的构造,将在应用程序的其他部分重用。例如,在应用程序中的其他地方一个组件,需要访问所有可用的套装:

// component.js 

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

我不是100%确定,但我不认为该流目前具有此功能。如果我需要做你描述的内容,我通常最终会写字符串文字两次(一次作为一种类型,一次作为一个值)。 –

回答

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' | ...

+0

如果将SUITS定义为数组,那么可以这样做吗? (因为无论如何SUITS是一个对象,这些值没有任何影响) –

+0

我试过了,但似乎没有被支持。它没有错误,但我无法弄清楚如何使它工作。但这是一个小的代价:) –