亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 1465 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號