簡體   English   中英

將字符串數組轉換為枚舉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM