【问题标题】:redeclare incorrect typsescript type in 3rd party library在 3rd 方库中重新声明不正确的打字稿类型
【发布时间】:2019-01-14 23:37:53
【问题描述】:

我正在使用带有@types/winston 类型的winston 3.0。这些类型尚不完全兼容,并且我遇到了类型中的错误,我不知道如何更正。

这是我的代码。

logger.ts

export function middleware(): express.Handler {
    const transport = new winston.transports.Console({
        json: true,
        colorize: true,
        stringify: getStringify()
    });
    const loggerOptions: expressWinston.LoggerOptionsWithTransports = {
        transports: [transport],
        meta: true,
        msg: "HTTP {{req.method}} {{req.url}}", 
        expressFormat: true, 
        colorize: false 
    };

    return expressWinston.logger(loggerOptions);
}

loggerOptions 上的 ts 错误是

“TransportInstance”类型中缺少“可写”属性

如果我使用 NodeJS.WriteStream 扩展 @types/winston 中的 TransportInstance 接口,问题就解决了。即改变这个:

interface TransportInstance extends TransportStatic, NodeJS.EventEmitter {

到这里:

interface TransportInstance extends TransportStatic, NodeJS.EventEmitter, NodeJS.WriteStream {

当然,我不能改变它,因为它是第 3 方依赖,并且声明在 node_modules 中。那么如何重新声明一个我作为 npm 依赖项导入的接口呢?

我已经开始调查Declaration Merging:

logger.d.ts

import * as winston from "winston";

export namespace winston {
    export interface TransportInstance
        extends winston.TransportInstance,
            NodeJS.WriteStream {}
}

但这没有任何影响。我不确定如何将此接口导入 logger.js,而不是导入 winston 库时出现的接口。

谢谢

【问题讨论】:

    标签: typescript npm typescript-typings


    【解决方案1】:

    尝试使用module augmentation。这对我有用:

    declare module "winston" {
        interface TransportInstance extends NodeJS.WriteStream {}
    }
    

    【讨论】:

    • 嗯。不,但我可能做错了。我已将您的代码添加到 logger.d.ts。我使用 TransportInstance 的函数在 logger.ts 中。我没有明确地将任何内容导入 logger.ts。我是不是该?我也尝试将您的代码直接添加到 logger.ts 中,但这也不起作用。
    • 我测试过,它在没有命名空间的情况下对我有用,但我不太明白这里发生了什么。编辑了答案。
    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 2019-02-16
    • 2021-01-20
    • 1970-01-01
    • 2022-01-06
    • 2017-06-10
    • 2021-01-12
    • 2020-09-12
    相关资源
    最近更新 更多