gpt4 book ai didi

typescript - Winston 自定义日志级别 typescript 定义

转载 作者:行者123 更新时间:2023-12-04 14:22:09 26 4
gpt4 key购买 nike

我正在开发一个节点应用程序并使用 Typescript。
我有 winston 3。
在我的代码中,我添加了自定义日志级别;

const myCustomLevels = {
levels: {
data: 10,
protocol: 9,
debug: 8,
info: 7,
notice: 6,
note: 5,
warn: 4,
error: 3,
crit: 2,
alert: 1,
emerg: 0,
}
}

然后
const logger = winston.createLogger({
level: data,
levels: myCustomLevels.levels,
format: winston.format.combine(
winston.format.json()
),
transports: [new winston.transports.Console()],
});

我需要帮助的问题是当我使用记录器 Typescript 提示。
logger.protocol({});

在这种情况下,类型是 const logger: winston.Logger和 ts 说 [ts] Property 'protocol' does not exist on type 'Logger'. [2339] .
typescript 不知道我的水平。

我该如何纠正这个问题,以便 tsc知道我在记录器上的水平吗?

最佳答案

不幸的是,当前编写的定义不允许自定义日志级别。最简单的解决方案是将返回的记录器强制转换为记录器和包含额外方法的类型的交集。我们可以使用映射类型 Record 根据您的 const 声明创建此类型。和 keyof

import * as winston from 'winston'
const logger = winston.createLogger({
level: data,
levels: myCustomLevels.levels,
format: winston.format.combine(
winston.format.json()
),
transports: [new winston.transports.Console()],
}) as winston.Logger & Record<keyof typeof myCustomLevels['levels'], winston.LeveledLogMethod>;

logger.protocol({})

注意我尝试增加现有的模块定义,但因为 createLogger被声明为带有内联函数签名的变量,我们无法真正通过扩充来扩展它。

如果这对您来说是一个普遍问题,您可以编写一个保留级别的通用函数:
function createWinstonLogger<T>(options?: Pick<winston.LoggerOptions, Exclude<keyof winston.LoggerOptions, 'levels'>> & { levels: T }) {
return winston.createLogger(options) as winston.Logger & Record<keyof T, winston.LeveledLogMethod>
}
const logger = createWinstonLogger({
level: data,
levels: myCustomLevels.levels,
format: winston.format.combine(
winston.format.json()
),
transports: [new winston.transports.Console()],
});
logger.protocol({})

关于typescript - Winston 自定义日志级别 typescript 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53298354/

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