现在是否有理由使用String Literals在TypeScript中有基于字符串的枚举?

时间:2017-09-01 14:30:20

标签: typescript

假设我有编译器选项noImplicitReturn打开,如果我有这段代码:

enum ListA {
    option1 = "opt1",
    option2 = "opt2",
    option3 = "opt3"
}

type ListB = "opt1" | "opt2" | "opt3";

function transformA(x: ListA): number {
    switch (x) {
        case ListA.option1:
            return 1;
        case ListA.option2:
            return 2;
    }
}

function transformB(x: ListB): number {
    switch (x) {
        case "opt1":
            return 1;
        case "opt2":
            return 2;
    }
}

这两种情况似乎都以类似的方式起作用,它们都被认为是有区别的工会,并且经过详尽的检查。

编译器会为transformA和transformB这两个函数抛出错误,因为它们都不处理所有可能的情况。

Code in playground.

那么现在有理由使用字符串文字吗?或者仅仅是品味问题?

在这种情况下,我更倾向于使用枚举,因为如果可能的值发生变化,它会使重构变得更容易。

2 个答案:

答案 0 :(得分:0)

一个原因是,如果您没有字符串值,例如:

>>import copy
>>dict2 = copy.copy(dict1)
>>dict2.pop("key1")
'val1'
>>dict2
{'key2': 'val2', 'key3': 'val3'}

答案 1 :(得分:0)

这不是一个有问题的问题,可以在Software Recommendations得到更好的回答。

您在帖子中描述的使用枚举替换字符串文字的用例在此示例中更为可靠,并且如您所说,在需要重构时更容易。但是,使用字符串文字仍然是一种很好的做法,例如,考虑使用keyof关键字来允许将类型或对象的所有已知键(与typeof一起)传递为有效参数。我发现自己经常使用mapped types因为它在编译时没有创建新对象,主要关注的是使用类型保护参数。