gpt4 book ai didi

typescript - 赋值前使用变量的常见模式

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:00 32 4
gpt4 key购买 nike

我有一个模块

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错误的解决方法:

Variable 'logger' is used before being assigned. [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 的斗士而不是开发人员 - 如此多的舞蹈来解决一个实际上不是问题的问题(

最佳答案

but even if it will be undefined it is suted for me

我建议使用 loggerundefined这不是一个好主意(下面有更多内容),但根据您上面的陈述:

对编译器和代码维护者明确说明:

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;
}

(不一定是 switch , if/else if/else 也可以。)

另请注意,您需要允许 logger具有值 undefined , as 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在第三个分支中,也许还有一个“什么都不做”的记录器。

这比让 logger 好得多是undefined .

关于typescript - 赋值前使用变量的常见模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53415708/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com