变量 'value' 在赋值前被使用

Variable 'value' is used before being assigned

我的代码:

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

使用 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

TypeScript 无法推断出循环 body 运行s 中的任何内容 - 它不会检查 i 从 0 开始,条件是 i < 10,并且 body 将因此至少 运行 一次。此行为与以下行为非常相似:

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

产生同样的错误。

要让TS知道这个值确实是最后定义的,你需要让它完全没有歧义。通常,实现此目的的最佳方法是通过数组方法和辅助函数定义并分配给变量 onceconst - TS 在重新分配最小化时效果最佳。