【问题标题】:TypeScript - No "Variable is used before being assigned" inside a functionTypeScript - 函数内没有“分配之前使用变量”
【发布时间】:2020-07-25 04:02:33
【问题描述】:

我想了解以下 TypeScript 行为:

以下代码

let a: number
if (a === undefined) {
    console.log("how?")
}

抛出错误:“变量'a'在被赋值之前被使用。”。

但是下面的代码

let a: number
const f = (): void => {
    if (a === undefined) {
        console.log("how?")
    }
}
f()

工作正常并记录“如何?”。

这是为什么呢?还有,a === undefined的类型是number怎么来的?

【问题讨论】:

    标签: typescript variables initialization undefined let


    【解决方案1】:

    Typescript GitHub 项目中有一个关于此的 open issue。这是打字稿技术设计的局限。

    来自瑞安·卡瓦诺,它是

    因为我们没有内联函数的流控制效果

    【讨论】:

      【解决方案2】:

      对于第二个问题:在 TS 中,未初始化的变量总是undefined,不管它们的类型。例如,这与 C# 不同,其中类型为 bool 的变量始终为真或假并初始化为假。在 TS 中,该变量也可能是未定义的,如果我没记错的话,也是 null。所以有时候写起来也不错

      if( testVariable === false)
      

      而不是简单

      if( !testVariable )
      

      【讨论】:

      • 谢谢。您说“在 TS 中,该变量也可能是未定义的,如果我没记错的话,也是 null。”,但是当我执行 let a: number = undefined 时,我得到:Type 'undefined' is not assignable to type 'number'.。怎么会?
      • 可能(我不确定)它只能在你用一个值初始化它之前是未定义的。之后,您只能为其分配一个有效的类型值。要分配 undefined,您必须将变量定义为 number | undefined
      【解决方案3】:

      要处理错误Variable 'a' is used before being assigned.,我认为的简单解决方案是将变量声明为either number undefined,而不仅仅是@987654324 @。

      let a: number | undefined
      

      另一种模式只是用一个值初始化一个变量:

      let a: number = 0
      

      几年前我在 C# 中经常使用这种模式,但我个人并不关心 JavaScript 中的那种模式,并且更喜欢你所拥有的,如果为它分配值的条件是有条件的,则不要设置变量。

      【讨论】:

        猜你喜欢
        • 2017-12-03
        • 2019-01-19
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        • 2019-11-06
        • 2021-08-16
        • 2021-12-29
        • 1970-01-01
        相关资源
        最近更新 更多