【问题标题】:Get array of string literal type values获取字符串文字类型值的数组
【发布时间】:2017-05-24 09:13:24
【问题描述】:

我需要获取字符串文字的所有可能值的完整列表。

type YesNo = "Yes" | "No";
let arrayOfYesNo : Array<string> = someMagicFunction(YesNo); //["Yes", "No"]

有什么方法可以实现吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    枚举在这里可以帮助你:

    enum YesNo {
        YES,
        NO
    }
    
    interface EnumObject {
        [enumValue: number]: string;
    }
    
    function getEnumValues(e: EnumObject): string[] {
        return Object.keys(e).map((i) => e[i]);
    }
    
    getEnumValues(YesNo); // ['YES', 'NO']
    

    type 声明不会创建您可以在运行时使用的任何符号,它只会在类型系统中创建一个别名。因此,您无法将其用作函数参数。

    如果您需要YesNo 类型的字符串值,您可以使用一个技巧(因为枚举的字符串值不是 TS yet 的一部分):

    const YesNoEnum = {
       Yes: 'Yes',
       No: 'No'
    };
    
    function thatAcceptsYesNoValue(vale: keyof typeof YesNoEnum): void {}
    

    然后您可以使用getEnumValues(YesNoEnum) 来获取YesNoEnum 的可能值,即['Yes', 'No']。这有点难看,但可以。

    说实话,我会使用这样的静态变量:

    type YesNo = 'yes' | 'no';
    const YES_NO_VALUES: YesNo[] = ['yes', 'no'];
    

    【讨论】:

    • 当我尝试@KirillDmitrenko 的建议时。我的数组也允许非文字值。例如const YES_NO_VALUES: YesNo[] = [ 'yes', 'no', 'maybe'];
    • getEnumValues 函数不应该是:function getEnumValues(e: EnumObject): string[] { return Object.keys(e).map((_, idx: number): string =&gt; e[idx]); }
    【解决方案2】:

    Typescript 2.4 是 finally released。在字符串枚举的支持下,我不再需要使用字符串文字,并且因为 typescript 枚举被编译为 javascript,我可以在运行时访问它们(与 number enums 相同的方法)。

    【讨论】:

    • 字符串枚举没有双向映射
    猜你喜欢
    • 1970-01-01
    • 2023-02-25
    • 2019-10-01
    • 2021-10-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2016-10-24
    相关资源
    最近更新 更多