我有一个模块
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的斗士,而不是开发者-如此众多的舞蹈解决了一个实际上不是问题的问题(
答案 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;
}
(不必是switch
,if
/ else if
/ else
也可以。)
还请注意,您需要允许logger
的值为undefined
,as VinceOPS points out:
let logger: Logger | undefined;
注意:这意味着使用 logger
的任何内容都必须允许其值为undefined
。如果我是你,我不会那样做。相反:
如果只需要支持列出的两个配置,则可以:
仅检查其中一个,然后假设另一个:
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);
}
或
在第三个分支中引发错误:
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");
}
如果要支持所有三种可能性(production
,development
或都不支持),请在第三分支中将logger
初始化为有效的Logger
,如下所示:好吧,也许是“无所事事”记录器。
那比让logger
为undefined
好得多。
答案 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