TS:模块扩充,<type>仅引用类型,但在此处用作值

时间:2018-07-23 07:16:22

标签: node.js typescript

我正在尝试为节点中的winston-syslogdirect link to main file)手动创建类型,但是遇到了问题。当我创建以下定义时:

// File: src/types/winston-syslog/index.d.ts
declare module 'winston-syslog' {
    import * as Transport from 'winston-transport';

    export interface SyslogTransportOptions extends Transport.TransportStreamOptions {
        host?: string;
        port?: number;
        path?: string;
        protocol?: string;
        pid?: number;
        facility?: string;
        localhost?: string;
        type?: string;
        app_name?: string;
        eol?: string;
        levels?: {[key: string]: number};
    }

    export interface Syslog extends Transport {
        new(options?: SyslogTransportOptions): Syslog;
    }

}

我无法创建Syslog实例,因为Typescript失败并显示以下错误:

  

错误TS2693:“ Syslog”仅引用一种类型,但在此处被用作值。

这是我的(大大减少的)主文件:

// File: src/Log.ts
import {Syslog, SyslogTransportOptions} from 'winston-syslog';
const transportOptions = {/* some values here */};
const syslogTransport = new Syslog(transportOptions);

我猜我定义Syslog类的方式有问题,但这正是在winston内部完成的方式。

1 个答案:

答案 0 :(得分:2)

系统日志是“ winston-syslog”软件包中的一个实例,而不是接口。您可以在单独的* .d.ts文件中编写稍微不同的类型定义。

declare module "winston-syslog" {
  export interface ISyslog {
    new (options: any): ISyslog;
    log(message: string): void;
  }

  export const Syslog: ISyslog;
}

然后,您可以像这样使用键入内容:

import * as Test from "winston-syslog";

const t = new Test.Syslog({}); // The type is ISyslog

t.log("blabla");