扩展 winston 传输的 Typescript 定义

Extend Typescript definition for winston transport

我添加了 winston-logstash 包,它是用于 logstash 的 winston 传输。不幸的是,它没有打字稿定义,我正在努力向其中添加自己的打字。

我试过的:

我的winston.ts:

import { Logger, LoggerInstance, transports } from 'winston';
require('winston-logstash');

export const logger: LoggerInstance = new Logger({
  transports: [
    // Console Logger Settings
    new transports.Console({
      timestamp: tsFormat,
      colorize: true,
      silent: false,
      prettyPrint: true,
      level: 'debug'
    }),

    new transports.Logstash({
      port: 28777,
      node_name: 'my node name',
      host: '127.0.0.1
    })
],
  exitOnError: false,
  colors: {
    trace: 'white',
    debug: 'green',
    info: 'blue',
    warn: 'yellow',
    crit: 'red',
    fatal: 'red'
  }
});

我的types/winston-extend.d.ts:

declare module "winston-logstash" {
  import winston = require("winston");
  import { TransportInstance } from 'winston';


  interface IOptions {
    port: number;
    node_name: string;
    host: string;
  }

  interface Static {
    new (opts: IOptions): Instance;
  }

  interface Instance extends winston.TransportInstance {
    log(level: string, msg: string, meta: any, cb: Function);
  }

  interface Transports {
    Logstash: Instance;
  }

  var Logstash: Static;
  export = Logstash;
}

错误:

[ts] Property 'Logstash' does not exist on type 'Transports'

我的问题:

如何为 winston 传输正确添加 typescript 定义(特别是 winston-logstash)?

扩充 winston Transports 接口时,需要用 module "winston" { ... }

包围它

这似乎有效:

declare module "winston-logstash" {
  import winston = require("winston");
  interface IOptions {
    port: number;
    node_name: string;
    host: string;
  }

  interface Static {
    new (opts: IOptions): Instance;
  }

  interface Instance extends winston.TransportInstance {
  }

  module "winston" {
    interface Transports {
      Logstash: Static;
    }
  }

  var Logstash: Static;
  export = Logstash;
}

我解决了以下问题:

const { Logstash } = require('winston-logstash')
...
logger.add(Logstash, {
                       port: LOGSTASH_PORT,
                       host: LOGSTASH_HOST,
                       node_name: APP_NAME
                     })