【问题标题】:How to handle unassigned variables in Typescript如何在 Typescript 中处理未分配的变量
【发布时间】:2019-08-08 09:26:20
【问题描述】:

以下 Typescript 代码在 catch 语句中导致编译错误 ts(2454): Variable "timeout" is used before it has been assigned

let timeout: NodeJS.Timeout
try {
    prepareConnection(() => {
        timeout = setTimeout(() => {
            console.log('timeout while opening connection');
        }, 10000);
        openConnection();
    });
} catch (err) {
    if (timeout) clearTimeout(timeout); //<-- Error ts(2454)
    console.error('error while opening connection');
}

什么是满足编译器的好方法?

另见问题Common pattern when variable is used before being assigned

【问题讨论】:

  • 在 try 块之外获取 setTimeout :)
  • @Icepickle 这确实可以解决问题,但我的代码有点复杂。 setTimeout 实际上是在另一个回调中调用的。见上文!

标签: node.js typescript


【解决方案1】:

我认为这里最好的解决方案是使用Definite Assignment Assertion(自 typescript 2.7 起可用)。

明确赋值断言是一个允许 !放置在实例属性和变量声明之后,以便向 TypeScript 传达一个变量确实是为所有意图和目的分配的,即使 TypeScript 的分析无法检测到这一点。

let timeout!: NodeJS.Timeout //add a exclamation mark "!"

【讨论】:

    【解决方案2】:

    这是一个完全有效的打字稿假设,在将 setTimeout 结果分配给 timeout 变量之前,try 块内可能出现了问题。

    因此,唯一安全的方法是将setTimeout移出try块,所以在声明时(setTimeout真的会出错,我认为你不会'不是真的关心这个,而是关心openConnection 语句期间发生的任何错误

    基于 OP 编辑​​的更新

    正如您提到的,它有点复杂,在声明时为其分配任何有效值也可以,即:

    let timeout: NodeJS.Timeout = null;
    

    【讨论】:

    • 将超时设置为nullundefined 会导致错误ts(2322): Type 'null' is not assignable to type 'NodeJS.Timeout'
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多