【问题标题】:TS: Module augmentation, <Type> only refers to a type but is being used as a value hereTS:模块扩充,<Type> 仅指一种类型,但在这里用作值
【发布时间】:2018-12-30 14:05:12
【问题描述】:

我正在尝试在节点中为 winston-syslog (direct 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 内部的做法。

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

    系统日志是您的“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");
    

    【讨论】:

    猜你喜欢
    • 2018-01-14
    • 2019-10-08
    • 2019-07-30
    • 1970-01-01
    • 2017-12-03
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多