[英]Convert array of strings into enum
說,我有一個數組const colors = ['R', 'G', 'B']
(或對象const colors = {R: 'R', G: 'G', B: 'B'}
這也將做)。 考慮到 typescript 枚舉轉換為對象,如果我沒有遺漏任何東西。 有沒有辦法將上面的數組(或對象)動態解析為枚舉?
例如類似的東西(例如,非工作偽代碼示例):
type Color = colors.reduce((palette, color) => palette | color)
或者
enum Color = colors.reduce((palette, color) => (palette[color] = color, palette), enum)
背后的整個想法是將一長串字符串值轉換為枚舉,無需硬編碼英里長的類型定義,例如:
type Color = 'R' | 'G' | 'B' .. /* followed by gazillion more color values */
簡短的回答:
只有數字枚舉可以有計算成員,但此表達式的類型為“字符串”。 如果您不需要窮舉檢查,請考慮使用對象文字代替`。
長答案:
不幸的是,您可以做到,但這並不意味着您應該:
const colors = ['R', 'G', 'B']
enum Color { }
const result = colors.reduce((acc, elem) => {
return {
...acc,
[elem]: elem
}
}, Color)
在這種情況下,您將失去類型安全性。 TS,無法弄清楚 Colot 枚舉的類型。
type O = keyof typeof result // never, TS don't know anymore nothing about this type
enum OkColor{
R='R',
G='G',
B='B'
}
type O2 = keyof typeof OkColor // 'R' | 'G' | 'B' ---> here TS knows the keys of enum
盡量避免使用enums
。 最好的方法是使用常量對象:
const colors = {
R:'R',
G: 'G',
B: 'B',
} as const;
如果您仍想使用枚舉,請至少將它們與const
關鍵字一起使用。 查看文檔
const enum X {
A='A'
}
這是將數組類型安全地轉換為只讀對象的代碼:
const colors = ['R', 'G', 'B'] as const;
type ValuesOfArray<T extends ReadonlyArray<any>> = T[number]
type ToObj<K extends string> = {
[P in K]: P
}
type ToEnum = ToObj<ValuesOfArray<typeof colors>>
const toPseudoEnum = <T extends readonly any[], K extends ValuesOfArray<T>>(arr: T):Readonly<ToObj<K>> => {
return arr.reduce((acc, elem) => {
return {
...acc,
[elem]: elem
}
}, {})
}
const customEnum = toPseudoEnum(colors); // {R:'R',G:'G',B:'B'}
我認為你需要這樣的東西:
const Colors = ['Red', 'Blue', 'Green'] as const;
type colors = typeof Colors[number] // 'Red' | 'Blue' | 'Green'
希望這對你有用:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.