簡體   English   中英

無法將字符串枚舉 typescript 定義為字符串不可分配

[英]Cannot define string enum typescript as string is not assignable

enum Cat {
    cat1 = 'cat1',
    cat2 = 'cat2',
    cat3 = 'cat3',
    cat4 = 'cat4',
    cat5 = 'cat5'
}
const category: Cat = 'cat' + cat

為什么我會收到 typescript 錯誤? cat是一個數字,所以category是一個字符串。 但我想為這個變量定義一些特定的字符串值。

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

我假設您希望類別成為 Cat 之一,而不是枚舉本身。 所以

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

如果嘗試訪問超出范圍的數字,這也可以為您提供類型安全。 操場

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'.

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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