【问题标题】:About Typescript and index关于打字稿和索引
【发布时间】:2021-02-07 06:19:32
【问题描述】:

我有一个关于如何在 TS 中正确使用索引的严肃问题,这有一段时间了。比如……

setup.battle.enemies.forEach(enemy => {
        const _thisMove = enemy.movements.random();

        enemy.curMovement = {
            name    : _thisMove.name,
            damage  : _thisMove.elemental.damage(),
            element : _thisMove.elemental.element,
            setMove() {
                const _resistances = variables().player.resistances;

                let _enemyDamage = Math.round(this.damage - _resistances[this.element]);
            }
        }
    })

在这种情况下,_resistances[this.element] 返回此错误... 元素隐含地具有 'any' 类型,因为 'any' 类型的表达式不能用于索引类型'{物理:数字;火:数字;冰:数字;能量:数字;水:数字;灯:数字;黑暗:数字; }'.ts(7053)

还有敌人类的抵抗力obj...

this.resistances = {
        physical : 2,
        fire : 0,
        ice : 0,
        energy : 0,
        water : 0,
        light : -2,
        darkness : 0
 };

所以我想问一下,我怎样才能使它正常工作?

元素属性是敌人技能数组的一部分。

this.movements = [
         {
                  name      : "Knife attack",
                  elemental : {
                        element : "physical",
                        damage : () => random(2, 4),
                        getElem : function() { return this.element }
                  }
         }
  ]

【问题讨论】:

  • 为所有事物赋予类型(毕竟它是 TypeScript)。 this.element 是什么类型的?目前,它是any,但这不起作用,因为错误告诉你。它需要(理想情况下)key of resistances"physical"|"fire"|"ice"|...string。理想情况下,resistances 本身就是一个类型; interface 或匿名类型。

标签: typescript


【解决方案1】:

为了使用resistances 的索引,您需要使用这样的索引声明接口并使用它定义resistances

interface Resistances {
  physical : number,
  fire : number,
  ice : number,
  energy : number,
  water : number,
  light : number,
  darkness : number,
  [index: string]: number;
}
const resistances: Resistances = {
        physical : 2,
        fire : 0,
        ice : 0,
        energy : 0,
        water : 0,
        light : -2,
        darkness : 0
}

【讨论】:

  • 我认为问题出在this.element,这个属性属于敌人技能数组的对象。我编辑了主要帖子并添加了它。
  • 你能先试试我的解决方案吗?如果它不起作用,我们可以进一步考虑
  • 成功了!谢谢,我还在体验TS。
猜你喜欢
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2021-08-11
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
相关资源
最近更新 更多