【问题标题】:Typescript strings and string enums - string not assignable打字稿字符串和字符串枚举 - 字符串不可分配
【发布时间】:2021-07-20 14:49:27
【问题描述】:

Typescript 手册并没有真正给我太多关于如何正确使用字符串枚举的信息。
Here 是我的例子:

enum ICE_CREAM {
    strawberry = "STRAWBERRY",
    vanilla = "VANILLA"
}

type TORDER = {
    greetings: string,
    flavor: ICE_CREAM
}

const mockData: TORDER = {
    greetings: "Hello",
    flavor: "VANILLA",
}

导致错误类型

'"VANILLA"' 不可分配给类型 'ICE_CREAM'。(2322)

我的后端将发送包含“风味”键的数据,我想确保它的值是我的ICE_CREAM 字符串枚举中声明的值之一。我做错了什么?

【问题讨论】:

    标签: typescript enums


    【解决方案1】:

    根据设计,您不能将字符串分配给类型为枚举的属性。您必须引用枚举才能分配其值之一。

    flavor: ICE_CREAM.vanilla
    

    但是,使用字符串联合类型有更好的方法。这样你就可以保持你的类型强大,同时让你的字符串成为字符串。

    type ICE_CREAM = 'STRAWBERRY' | 'VANILLA';
    
    type TORDER = {
        greetings: string,
        flavor: ICE_CREAM
    }
    
    const mockData: TORDER = {
        greetings: "Hello",
        flavor: "VANILLA", // Assigns without error
    }
    
    const badMockData: TORDER = {
      greetings: "Hello",
      flavor: "vanilla", // Error: flavor can only be 'STRAWBERRY' or 'VANILLA'
    }
    

    【讨论】:

    • 啊,谢谢。因此,对于我的用例,字符串联合类型确实是正确的方法,而枚举甚至不适合我的需要。不错!
    【解决方案2】:

    直觉上你应该可以使用底层字符串,因为毕竟它们是一样的,对吧?

    但是,从语义上讲,它们并不相同。以enum 为例:

    enum SILLY_PROGRAMMER {
        ten = "TEN",
        twenty = "TWENTY"
    }
    

    假设某个程序员在他们的 1000 行代码中使用了这个枚举,突然他们意识到他们犯了一个错误!他们的原始代码实际上是这样的:

    enum SILLY_PROGRAMMER {
        ten = "TWENTY",
        twenty = "TEN"
    }
    

    哦不!现在他们将不得不重写所有内容,对吗?错了,他们只需要更改枚举。这在您编写 API 并且在返回的常量数据中有一些错误时特别有用,只需更改枚举即可。

    然而,如果没有这个,而不是自动更新,类型只是不匹配。这意味着您必须在任何看到错误的地方手动更正它。

    因此,这就是做出此决定的原因,以及为什么如果您想拥有上述行为,它是“正确”的决定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2017-06-08
      • 2021-04-19
      • 1970-01-01
      • 2019-03-24
      • 2019-10-30
      • 2020-07-11
      相关资源
      最近更新 更多