打字稿默认导出未定义

时间:2017-11-05 20:35:33

标签: typescript typescript-typings

我正在编写一个npm模块,一个简单的记录器。我用简单的JS写了这个:

logger.js

class Logger {
  // stuff
}

module.exports = Logger;

在js脚本中,这很好用:

记录器-test.js

const Logger = require('ep-logger');

const logger = new Logger('my-logger');
logger.info('yo');

但我们公司使用 TypeScript 。因此,在logger.js旁边,我创建了一个文件logger.d.ts,内容如下

export interface SplunkOptions {
    endpoint?: string
    loggingSource?: string
    loggingSourceType?: string
}

export interface LoggerOptions {
    stage?: string
    level?: string
    splunk?: SplunkOptions
}

export default class Logger {
    constructor(name: string);

    public static setOptions(obj: LoggerOptions): void;

    public error(message: string | Error, ...data: any[]): void;
    public warn(message: string | Error, ...data: any[]): void;
    public info(message: string | Error, ...data: any[]): void;
    public verbose(message: string | Error, ...data: any[]): void;
    public debug(message: string | Error, ...data: any[]): void;
    public silly(message: string | Error, ...data: any[]): void;
}

package.json我做了这个:

{
  // more package.json stuff here
  "main": "src/logger.js",
  "types": "src/logger.d.ts"
}

现在在我的 TypeScript - 项目中我正在尝试使用我的记录器:

index.ts

import Logger from 'ep-logger';

const logger: Logger = new Logger('my-logger');
logger.info('yo');

但是我得到一个错误,我的记录器没有默认导出:

  

{错误:命令失败:ts-node local-lambda.ts --colors

     

/ Users / luke / Arbeit / WeltN24 / Editorial Products / projects / ep-logger-tests / js-app / yo-lambda / src / index.ts:5     const logger:Logger = new Logger('my-logger');                            ^   TypeError:ep_logger_1.default不是构造函数   ...

事实上,如果我这样做

console.log(Logger);

我得到了

undefined

1 个答案:

答案 0 :(得分:1)

使用当前版本的typescript(2.6或更低版本),您需要使用export assignment而不是默认导出来编写定义文件:

export interface SplunkOptions {
    //...
}

export interface LoggerOptions {
    //...
}

export class Logger {
    //...
}

export = Logger;

It seems like the plan is to change all that in the next version(2.7),你最初编写它的方式将开始工作(在此过程中打破export =),最初在--strictESM标志后面,然后从2.8开始,作为没有任何标志的默认行为。