在分配变量之前使用变量的常见模式

时间:2018-11-21 15:45:47

标签: typescript

我有一个模块

import pino, { Logger } from 'pino';

let logger: Logger;

if (process.env.NODE_ENV === 'production') {
    const dest = pino.extreme();
    logger = pino(dest);
}

if (process.env.NODE_ENV === 'development') {
    // @ts-ignore
    logger = pino({ prettyPrint: { colorize: true } });
}

...

export default logger;
// ^^^ [ts] Variable 'logger' is used before being assigned. [2454]

在没有定义记录器的情况下,没有任何情况,但是即使将记录器定义为未定义,对我来说也是

如何最后解决TypeScript错误:

  

使用可变的“记录器”,然后分配。 [2454]

我已经重写了代码,但错误仍然存​​在

import pino, { Logger } from 'pino';

let logger: Logger;

if (process.env.NODE_ENV === 'production') {
    const dest = pino.extreme();
    logger = pino(dest);
} else 

if (process.env.NODE_ENV === 'development') {
    // @ts-ignore
    logger = pino({ prettyPrint: { colorize: true } });
} else

if (process.env.NODE_ENV === undefined) {
    throw new Error('Logger must be initialized! Set up process.env.NODE_ENV');
}

if (logger) { // <-- Variable 'logger' is used before being assigned. [2454]
   // configuring process
}

export default logger;

即使以另一种方式

import pino, { Logger } from 'pino';

let logger: Logger;

function configureProcess(theLogger: Logger) {
  // setup process with theLogger
}

if (process.env.NODE_ENV === 'production') {
    const dest = pino.extreme();
    logger = pino(dest);
    configureProcess(logger); // <-- code duplication
} else if (process.env.NODE_ENV === 'development') {
    // @ts-ignore
    logger = pino({ prettyPrint: { colorize: true } });
    configureProcess(logger); // <-- code duplication
}

if (process.env.NODE_ENV === undefined) {
    throw new Error('Logger must be initialized! Set up process.env.NODE_ENV');
}

export default logger;
// ^^^ [ts] Variable 'logger' is used before being assigned. [2454]

我感觉自己像是反对TypeScrit的斗士,而不是开发者-如此众多的舞蹈解决了一个实际上不是问题的问题(

4 个答案:

答案 0 :(得分:3)

  

但是即使它不确定,也会对我来说是

我建议将logger设为undefined并不是一个好主意(更多内容请参见下文),但基于您在上面的陈述:

对代码的编译器和维护者进行明确的显示:

switch (process.env.NODE_ENV) {
    case 'production':
        const dest = pino.extreme(); // logs to stdout with no args
        logger = pino(dest);
        break;
    case 'development':
        // @ts-ignore
        logger = pino({ prettyPrint: { colorize: true } });
        break;
    default:
        logger = undefined; // That's fine
        break;
}

(不必是switchif / else if / else也可以。)

还请注意,您需要允许logger的值为undefinedas VinceOPS points out

let logger: Logger | undefined;

注意:这意味着使用 logger的任何内容都必须允许其值为undefined。如果我是你,我不会那样做。相反:

  1. 如果只需要支持列出的两个配置,则可以:

    1. 仅检查其中一个,然后假设另一个:

      if (process.env.NODE_ENV === 'development') {
          case 'development':
              // @ts-ignore
              logger = pino({ prettyPrint: { colorize: true } });
      } else { // production
              const dest = pino.extreme(); // logs to stdout with no args
              logger = pino(dest);
      }
      

    2. 在第三个分支中引发错误:

      switch (process.env.NODE_ENV) {
          case 'production':
              const dest = pino.extreme(); // logs to stdout with no args
              logger = pino(dest);
              break;
          case 'development':
              // @ts-ignore
              logger = pino({ prettyPrint: { colorize: true } });
              break;
          default:
              throw new Error("process.env.NODE_ENV must be either 'production' or 'development' to use this module");
      }
      
  2. 如果要支持所有三种可能性(productiondevelopment或都不支持),请在第三分支中将logger初始化为有效的Logger,如下所示:好吧,也许是“无所事事”记录器。

那比让loggerundefined好得多。

答案 1 :(得分:1)

或更简单,假设:

  

但是即使它不确定,也会对我来说是

替换

let logger: Logger;  

使用

let logger: Logger | undefined;

如果logger 可能未定义,则将其注释为可能未定义。这样tsc就不会再抱怨了。

答案 2 :(得分:1)

您不必使它也可分配给undefined,如果您的分支逻辑很详尽,则编译器将理解必须分配logger

我假设您只想支持两种日志记录模式,production或始终支持development,因此只需将其设置为if / else,编译器就会感到满意

import pino, { Logger } from 'pino';

let logger: Logger;

if (process.env.NODE_ENV === 'production') {
  const dest = pino.extreme(); // logs to stdout with no args
  logger = pino(dest);
} else {
  logger = pino({ prettyPrint: { colorize: true } });
}

if (process.env.NODE_ENV === undefined) {
  throw new Error('Logger must be initialized! Set up process.env.NODE_ENV');
}

export default logger;

答案 3 :(得分:-2)

这是最终的工作代码

position: absolute