TypeScript - 函数内没有“分配之前使用变量”

Posted

技术标签:

【中文标题】TypeScript - 函数内没有“分配之前使用变量”【英文标题】:TypeScript - No "Variable is used before being assigned" inside a function 【发布时间】: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怎么来的?

【问题讨论】:

【参考方案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 中的那种模式,并且更喜欢你所拥有的,如果为它分配值的条件是有条件的,则不要设置变量。

【讨论】:

以上是关于TypeScript - 函数内没有“分配之前使用变量”的主要内容,如果未能解决你的问题,请参考以下文章

Angular:全局变量在订阅函数内没有改变

为啥 TypeScript 中没有重载的构造函数实现?

TypeScript--函数作用域

Sequelize Typescript Sequelize Typescript TypeError:没有'new'就不能调用类构造函数模型

为没有或许多不同参数类型的函数定义 Typescript 类型

为啥 TypeScript 4 转译器没有看到这个不正确的类型传递给函数?