【问题标题】:Variable 'value' is used before being assigned在分配之前使用变量“值”
【发布时间】:2021-12-29 21:39:41
【问题描述】:

我的代码:

function test() {
  let value: number;

  for (let i = 0; i < 10; i++) {
    value = i;
    console.log(value);
  }

  return value;
}

test();

得到了这个:

Variable 'value' is used before being assigned

我觉得这很奇怪,因为我看到过其他类似的问题,这些问题要么使用回调,要么使用 Promise 或其他一些异步方法,而我只使用了同步 for 循环。

---------------------- 一些更新 ------------ -------------

function test() {
  let value: number;

  for (let i = 0; i < 100; i++) {
    // a() is very expensive and with some effects
    const result = a(i)

    if(i===99) {
      value = result
    }

  }

  return value;
}

【问题讨论】:

  • Typescript 不知道您的循环体将至少执行一次,并且 value 变量确实会被初始化。这就是你得到错误的原因。分配任何初始值将修复错误。

标签: javascript typescript for-loop variables variable-assignment


【解决方案1】:

使用non-null assertion operator 确保“在类型检查器无法得出该事实的上下文中,其操作数是非空且非未定义的。”

function test() {
  let value!: number;

  for (let i = 0; i < 10; i++) {
    value = i;
    console.log(value);
  }

  return value;
}

test();

Result

【讨论】:

    【解决方案2】:

    TypeScript 无法推断循环体中的任何内容都在运行 - 它不会检查 i 是否从 0 开始,条件是否为 i &lt; 10,因此循环体将至少运行一次。此行为与以下行为非常相似:

    function test() {
      let value: number;
      if (Math.random() < 0.5) {
        value = 5;
      }
      return value;
    }
    

    产生同样的错误。

    要让 TS 知道该值确实在最后定义,您需要使其完全明确。通常,实现这一点的最佳方式是使用const,通过数组方法和辅助函数定义并分配给变量once - 当重新分配最小化时,TS 工作得最好。

    【讨论】:

    • 感谢您的回答,但我没有完全理解。你能告诉我一些关于你最好的方法的代码吗?
    • 这真的取决于你到底想要做什么 - 据我所知,问题中没有足够的上下文来了解你在函数中尝试做什么,并且为什么你只在循环内重新分配。在 97% 的情况下,可以将 lets 重构为 consts(这通常会让 TS 感到高兴),但重构的具体如何差异很大。
    • 原因是我在for循环中有一个非常昂贵的计算,我想在最后一个循环体中保存一些结果,你可以看到更新部分。
    • 对于该代码,要修复它,从 0 迭代到 98 而不是从 0 到 99,然后在循环之外执行 return a(99)。
    • 是的,它适用于这种情况,但是 a(50) 怎么样?
    猜你喜欢
    • 2019-11-06
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2019-01-19
    • 1970-01-01
    • 2012-02-03
    • 2021-06-22
    相关资源
    最近更新 更多