【问题标题】:Variable 'x' is used before being assigned变量“x”在分配之前使用
【发布时间】:2019-11-06 01:04:34
【问题描述】:

我在Logger 类中得到了以下静态方法。我很不明白tsserver 错误。

日志级别

const enum LogLevel {
    ERROR = 0,
    WARN = 1
}

export default LogLevel;

记录器

    static defaultHandler(level: LogLevel, ...message: readonly string[]) {
        if (!Logger.isLevelEnabled(level)) return;

        let handler: Function;
        switch (level) {
            case LogLevel.ERROR:
                handler = console.error;
                break;

            case LogLevel.WARN:
                handler = console.warn;
                break;
        }

        // [tsserver 2454] Variable 'handler' is used before being assigned
        handler(...message);
    }

由于LogLevel 是一个枚举,处理程序永远不会被取消分配。如果我添加 iftslint 会抱怨。

        // [tslint 1] expression is always true (strict-type-predicates)
        if (handler !== undefined) handler(...message);

我什至删除了no-let tslint 规则,因为它出于某种原因在switch 案例中看不到分配,并希望我使用const handler: Function;。谁能解释一下这里发生了什么。

【问题讨论】:

  • 在switch中提供default,否则可能是未定义的,或者用somehting初始化

标签: typescript


【解决方案1】:

你有

let handler: Function;
switch (level) {
    case LogLevel.ERROR:
        handler = console.error;
        break;

    case LogLevel.WARN:
        handler = console.warn;
        break;
}

您只处理ERRORWARN。选项更多:

ERROR = 0,
WARN = 1,
INFO = 2,
DEBUG = 3,
VERBOSE = 4

修复

添加一个默认值以适应其余情况:

    let handler: Function;
    switch (level) {
        case LogLevel.ERROR:
            handler = console.error;
            break;

        case LogLevel.WARN:
            handler = console.warn;
            break;

        default: 
            handler = console.log;
            break;
    }

【讨论】:

  • 由于他们编辑了问题,值得一提的是,如果有更多可用选项,这并没有什么不同。唯一重要的是,如果没有默认值,它可能是未定义的
  • 非常抱歉。我删除了一些开关盒,因为它很难看。我实际上正在处理enum 中的所有值
  • 再次@CoderS 没关系。你需要一个默认值
  • @CoderS 代码分析器无法识别您处理所有枚举值。它的原因是“如果没有default,那么handler 可能不会被分配”。
  • @chrispbacon 所以strict-type-predicates 看到了枚举,而tsserver 不对?
猜你喜欢
  • 2021-08-16
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 2019-01-19
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多