TypeScript - 函数内部没有 "Variable is used before being assigned"

TypeScript - No "Variable is used before being assigned" inside a function

我想了解以下 TypeScript 行为:

以下代码

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

抛出错误:"Variable 'a' is used before being assigned."。

但是下面的代码

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

工作正常并记录 "how?"。

这是为什么?还有,如果它的类型是 number,怎么会 a === undefined

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

来自 Ryan Cavanaugh,

because we don't inline the flow-control effects of functions

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

也不错
if( testVariable === false)

而不是简单地

if( !testVariable )

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

let a: number | undefined

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

let a: number = 0

几年前我在 C# 中经常使用该模式,但我个人并不关心 JavaScript 中的该模式,并且更喜欢在分配变量的条件下不设置变量一个值是有条件的。