typescript - 动态访问对象值时修复类型错误,即 myObject [`VALUE_${variable}`]

标签 typescript

我有以下对象

const CHARACTER_ITEMS = {
  ITEM_ARMS_LIGHT: "",
  ITEM_LEGS_LIGHT: "",
  ITEM_ARMS_HEAVY: "",
  ITEM_LEGS_HEAVY: ""
}

然后我想以动态方式访问这个对象的一些值,即

const variant = 'HEAVY'; // This is dynamic, based on server response
const arms = CHARACTER_ITEMS[`ITEM_LEGS_${variant}`]

不幸的是,这会引发错误

No index signature with a parameter of type 'string' was found on type '{ ITEM_ARMS_LIGHT: any; ...

我试过像这样输入我的variant

const variant: 'HEAVY' | 'LIGHT' = 'HEAVY';

但是运气不好,出现了同样的错误。有没有办法在不使用禁用注释和保持类型安全的情况下解决这个问题?即 variant 将始终具有解析为 CHARACTER_ITEMS

中的条目的正确值

最佳答案

如果您这样做,我认为不可能使用字符串连接/插值。有一个类似的例子解释了 here它说:

...make sure to use simple string literal assignment with const. This limitation is coming from the type-system, because all the dynamic string operations (e.g. string concatenation, template strings and also object used as a map) will widen the literal type to its super-type, string

所以我认为您最好的选择可能是拥有一个将您的变体转换为表示 CHARACTER_ITEMS 属性的特定字符串文字的函数。这是一种可能的解决方案:

const convert = (member: "ARMS" | "LEGS", weight: "LIGHT" | "HEAVY") : keyof typeof CHARACTER_ITEMS => {
    if (member === "ARMS")
        return weight === "LIGHT" ? "ITEM_ARMS_LIGHT" : "ITEM_ARMS_HEAVY"
    else
        return weight === "LIGHT" ? "ITEM_LEGS_LIGHT" : "ITEM_LEGS_HEAVY"
}

const variant = 'HEAVY'; // This is dynamic, based on server response
//const arms = CHARACTER_ITEMS[`ITEM_LEGS_${variant}`]
const arms = CHARACTER_ITEMS[convert("ARMS", variant)]

关于typescript - 动态访问对象值时修复类型错误,即 myObject [`VALUE_${variable}`],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57395252/

相关文章:

typescript - 在 TypeScript 中生成 "Unreachable code detected"编译警告而不是错误?

javascript - 如何将 event.target 作为 Angular 2 中的对象获取?

html - 如何在 Angular 12 中制作 Material-UI 输入文本字段 "read only"

html - 无法显示 tinymce

arrays - 使用无效数据调用函数FieldValue.arrayUnion()。 FieldValue.serverTimestamp()只能与update()和set()一起使用

javascript - Angular 和 ngrx : problems during upgrading to version8

javascript - 如何将文件连同数据从 Angular 上传到 .NET Core

javascript - 使用 Javascript 比较嵌套对象并保存新对象中的差异

Angular 单元测试 :WARN: 'Navigation triggered outside Angular zone, did you forget to call ' ngZone. 运行()'?'

typescript - TS2307 : Cannot find module 'class-validator'