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 - 函数内没有“分配之前使用变量”的主要内容,如果未能解决你的问题,请参考以下文章
Sequelize Typescript Sequelize Typescript TypeError:没有'new'就不能调用类构造函数模型