无法将字符串枚举类型脚本定义为字符串不可分配

Posted

技术标签:

【中文标题】无法将字符串枚举类型脚本定义为字符串不可分配【英文标题】:Cannot define string enum typescript as string is not assignable 【发布时间】:2022-01-23 16:10:31 【问题描述】:
enum Cat 
    cat1 = 'cat1',
    cat2 = 'cat2',
    cat3 = 'cat3',
    cat4 = 'cat4',
    cat5 = 'cat5'

const category: Cat = 'cat' + cat

为什么我会收到打字稿错误? cat 是一个数字,所以 category 是一个字符串。但是我想为这个变量定义一些特定的字符串值。

Type 'string' is not assignable to type 'Cat'.

【问题讨论】:

【参考方案1】:

我假设您希望类别是 Cat 之一,而不是枚举本身。所以

const cat = 4;
const category = Cat[`cat$cat`] // category: Cat.cat4

如果尝试访问超出范围的数字,这也可以为您提供键入安全性。 playground

enum Cat 
    cat1 = 'cat1',
    cat2 = 'cat2',
    cat3 = 'cat3',
    cat4 = 'cat4',
    cat5 = 'cat5'


const cat = 4;
const category = Cat[`cat$cat`]

const cat6 = 6;
const category6 = Cat[`cat$cat6`] // Property 'cat6' does not exist on type 'typeof Cat'.

【讨论】:

【参考方案2】:

Typescript 无法确保 cat1,2,3,4, or 5,因为它也可能是 someThingElse。因此你必须告诉 typescript 你确定它的类型是Cat

这里的问题是编译器不允许将'cat' + someVar 用作Cat 类型。

使用时请小心,因为您实际上会覆盖编译器错误。你真的需要确保你之前所做的一切都是一只有效的猫。

enum Cat 
  cat1 = 'cat1',
  cat2 = 'cat2',
  cat3 = 'cat3',
  cat4 = 'cat4',
  cat5 = 'cat5',

const category: Cat = (('cat' + cat) as Cat);
enum Cat 
  cat1 = 'cat1',
  cat2 = 'cat2',
  cat3 = 'cat3',
  cat4 = 'cat4',
  cat5 = 'cat5',


// this would be of however [Cat.cat1, Cat.cat2 ...] would be a lot safer. 
// I would generally suggest not tot use dynamic enum values like this.
for (const i of [1,2,3,4,5]) 
  const category: Cat = (('cat' + i) as Cat);


// the compiler would allow this as well, since you ensure that you know the type is going to be if type Cat
for (const i of ['dog']) 
  const category: Cat = (('cat' + i) as Cat);

【讨论】:

谢谢,但我不明白。据我了解,我必须将结果两次定义为Cat。我显然错了,但是为什么我必须将右侧和左侧都定义为Cat TS 中的枚举很糟糕。它甚至会接受const category: Cat = 'dog99' as Cat;,这将像枚举根本不存在一样工作。 @PeterB 如果您正确访问它们而不是强制类型它可以正常工作const category = Cat.dog99 -> // Property 'dog99' does not exist on type 'typeof Cat'. 没错,但是很容易做错,这正是强类型语言应该防止的。 一个好的规则是如果你必须强制一个类型你可能会破坏安全......

以上是关于无法将字符串枚举类型脚本定义为字符串不可分配的主要内容,如果未能解决你的问题,请参考以下文章

类型'string'不可分配给类型枚举错误

C#如何将枚举类(enum)型转换成字符(string)类型

ConditionalOnExpression 无法将配置属性与枚举类型进行比较,作为字符串工作

C#如何将枚举类(enum)型转换成字符(string)类型

将字符串数组转换为WHERE子句中的自定义枚举类型

Swift 学习- 09 -- 枚举