为了账号安全,请及时绑定邮箱和手机立即绑定

TypeScript字符串联合到字符串数组

TypeScript字符串联合到字符串数组

长风秋雁 2019-12-04 09:57:35
我有一个字符串联合类型,如下所示:type Suit = 'hearts' | 'diamonds' | 'spades' | 'clubs';我想要一种类型安全的方法来获取可以在此字符串联合中使用的所有可能的值。但是由于接口在很大程度上是设计时构造,所以我能做的就是:export const ALL_SUITS = getAllStringUnionValues<Suit>({    hearts: 0,    diamonds: 0,    spades: 0,    clubs: 0});export function getAllStringUnionValues<TStringUnion extends string>(valuesAsKeys: { [K in TStringUnion]: 0 }): TStringUnion[] {    const result = Object.getOwnPropertyNames(valuesAsKeys);    return result as any;}这项工作正常,该函数可确保我始终传递一个对象,其中每个键都是字符串联合中的一个元素,并且包括每个元素,并返回所有元素的字符串数组。因此,如果字符串并集发生更改,则对该函数的调用将在编译时发生错误(如果未更新)。但是问题是常量ALL_SUITSis 的类型签名('hearts' | 'diamonds' | 'spades' | 'clubs')[]。换句话说,TypeScript认为这是一个不包含一个或多个这些值(可能带有重复项)的数组,而不是一个仅包含一次所有值的数组,例如['hearts', 'diamonds', 'spades', 'clubs']。我真正想要的是通用getAllStringUnionValues函数指定它返回的一种方法['hearts', 'diamonds', 'spades', 'clubs']。我怎样才能做到这一点一般,同时为干越好?
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

TypeScript 3.4的更新:

TypeScript 3.4附带了更简洁的语法,称为“ const contexts”。它已经合并到master中,因此在PR中应该可以立即使用。


此功能将使通过使用as constor <const>关键字创建不可变(恒定)元组类型/数组成为可能。由于无法修改此数组,因此TypeScript可以安全地采用较窄的文字类型,['a', 'b']而不是较宽的类型,('a' | 'b')[]甚至string[]可以忽略该类型,并且我们可以跳过对tuple()函数的调用。


提及你的问题


但是,问题在于常量ALL_SUITS的类型签名为('hearts'|'diamonds'|'spades'|'clubs')[]。 (...宁可这样) ['hearts','diamonds','spades','clubs']


使用新的语法,我们可以准确地实现以下目标:


const ALL_SUITS = <const> ['hearts', 'diamonds', 'spades', 'clubs'];  

// or 

const ALL_SUITS = ['hearts', 'diamonds', 'spades', 'clubs'] as const;


// type of ALL_SUITS is infererd to ['hearts', 'diamonds', 'spades', 'clubs']

有了这个不可变的数组,我们可以轻松地创建所需的联合类型:


type Suits = typeof ALL_SUITS[number]  


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 1373 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信