【问题标题】:Typescript default export undefined打字稿默认导出未定义
【发布时间】:2018-04-17 23:47:14
【问题描述】:

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

logger.js

class Logger {
  // stuff
}

module.exports = Logger;

在 js 脚本中,这可以正常工作:

logger-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

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案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 开始,作为默认行为,没有任何标志。

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 2016-01-23
      • 2016-02-10
      • 2019-12-11
      • 2021-02-07
      • 2017-09-23
      • 2020-05-17
      • 2019-05-01
      • 2018-01-21
      相关资源
      最近更新 更多