遍历对象引发“元素隐式具有“任何”类型,因为类型“字符串”的表达式不能用于索引类型”

时间:2020-06-22 19:35:02

标签: javascript typescript foreach react-typescript

因此,我正在构建一个饮食跟踪应用程序,并在我的组件内计算用户剩余的大量营养素。我认为一种有效的方法是将三个变量存储到一个对象中,因此我可以对其进行迭代以计算剩余值。在实施打字稿之前,代码可以正常工作,但是现在我已经将文件转换为打字稿,它引发了以下错误,我似乎无法解决:

错误:

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ f: number; c: number | null; d: number | null; k: number | null; p: number; e: number; w: number | null; }'.
  No index signature with a parameter of type 'string' was found on type '{ f: number; c: number | null; d: number | null; k: number | null; p: number; e: number; w: number | null; }'.

存储值的对象:

const values: Mapper = {
        consumed: {
          f: entry.m.f,
          c: entry.m.c,
          d: entry.m.d,
          k: entry.m.k,
          p: entry.m.p,
          e: entry.m.e,
          w: entry.w.t,
        },
        goals: {
          f: entry.g.s.f,
          c: entry.g.s.c,
          d: entry.g.s.d,
          k: entry.g.s.k,
          p: entry.g.s.p,
          e: entry.g.s.e,
          w: entry.g.s.w,
        },
        sum: {
          f: 0,
          c: 0,
          d: 0,
          k: 0,
          p: 0,
          e: 0,
          w: 0,
        },
      };

使用的界面

interface Mapper {
    consumed: {
      f: number;
      c: number | null;
      d: number | null;
      k: number | null;
      p: number;
      e: number;
      w: number | null;
    };
    goals: {
      f: number;
      c: number | null;
      d: number | null;
      k: number | null;
      p: number;
      e: number;
      w: number | null;
    };
    sum: {
      f: number;
      c: number | null;
      d: number | null;
      k: number | null;
      p: number;
      e: number;
      w: number | null;
    };
  }

我的.forEach:

goals.forEach((goal) => {
            if (values.goals[goal] !== null) {
              values.sum[goal] = +(
                values.goals[goal] - values.consumed[goal]
              ).toFixed(1);
            }
          });

我不明白。 forEach甚至确保对values.sum [goal]的分配是一个数字。我已经控制台记录了类型并验证了号码分配。那为什么给我这么难呢?我也尝试过Object.keys(values).forEach [ ... ],但是没有运气。

有人可以在这里帮助我吗?我对打字稿很陌生,所以我想我可能只是在这里犯了一个简单的错误...

感谢您抽出宝贵的时间来阅读和帮助!

1 个答案:

答案 0 :(得分:0)

对于遇到类似问题的人,我有解决方法:

您必须使用[index: string]: any;定义索引类型,并在其中进行迭代

interface Mapper {
    [index: string]: any;
    consumed: {
      [index: string]: any;
      f: number;
      c: number | null;
      d: number | null;
      k: number | null;
      p: number;
      e: number;
      w: number | null;
    };
    goals: {
      [index: string]: any;
      f: number;
      c: number | null;
      d: number | null;
      k: number | null;
      p: number;
      e: number;
      w: number | null;
    };
    sum: {
      [index: string]: any;
      f: number;
      c: number | null;
      d: number | null;
      k: number | null;
      p: number;
      e: number;
      w: number | null;
    };
  }