TypeScript:默认不是构造函数

时间:2017-09-22 15:08:12

标签: typescript import module export typescript-typings

在我的TypeScript项目中,我想使用名为" pure-uuid"的Node.js模块。

使用纯JavaScript," pure-uuid"可以按如下方式使用:

const UUID = require('pure-uuid')
const id = new UUID(4).format();

我将代码翻译成TypeScript:

import UUID from 'pure-uuid';
const id:string = new UUID(4).format();

编译代码时,会生成以下内容:

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var pure_uuid_1 = require("pure-uuid");
var id = new pure_uuid_1.default(4).format();

不幸的是,TypeScript在" pure-uuid"中添加了.default。引用,使代码在执行时失败:

TypeError: pure_uuid_1.default is not a constructor

我认为错误的编译是由TypeScript定义文件中的错误引起的(已经手动编写):

interface UUID {
    /*  making  */
    make(version: number, ...params: any[]): UUID;

    /*  parsing  */
    parse(str: string): UUID;

    /*  formatting  */
    format(type?: string): string;

    /*  formatting (alias)  */
    tostring(type?: string): string;

    /*  importing  */
    import(arr: number[]): UUID;

    /*  exporting  */
    export(): number[];

    /*  byte-wise comparison  */
    compare(other: UUID): boolean;
}

export interface UUIDConstructor {
  /*  default construction  */
  new(): UUID;

  /*  parsing construction  */
  new(uuid: string): UUID;

  /*  making construction  */
  new(version: number): UUID;
  new(version: number, ns: string, data: string): UUID;
}

declare var UUID: UUIDConstructor;
export default UUID;

导出" pure-uuid"的正确方法是什么?模块?

3 个答案:

答案 0 :(得分:2)

尝试export =

interface UUID {
  // ...
}

interface UUIDConstructor {
  /*  default construction  */
  new(): UUID;
  // ...
}

declare var tmp: UUIDConstructor;
export = tmp;

另请参阅:The documentation on export =

然后,以下代码:

const UUID = require('pure-uuid')

...必须翻译为:

import UUID = require('pure-uuid');

答案 1 :(得分:0)

您不能在接口中声明构造函数声明。

Typescript是JavaScript的超集,它包含JavaScript。因此,您的TypeScript应该是这样的:

const UUID = require('pure-uuid');
const id = new UUID(4).format();

答案 2 :(得分:0)

我在此处添加此答案,因为此问题中的错误可能会弹出 拥有许多JavaScript库,而这正是人们可能会寻找的地方之一。起初,错误消息使我非常困惑。 (我在AWS开发工具包中遇到了此问题。)

因此,我认为您要查找的导入具有以下格式:

import * as UUID from 'pure-uuid'

这将从pure-uuid导入所有内容,并将其放入命名空间UUID中。

请注意,从pure-script 1.4版开始,更简单的导入可以按预期进行:

import UIID from 'pure-uuid'

错误TypeError: foo_bar_1.default is not a constructor是由于导入的模块未在其“默认导出”中提供所需的定义引起的。

请参见TypeScript documentation on modulesMozilla documentation on Javascript import-statement可能更容易快速浏览。 两种语言AFAIK的语法都相同。 (TypeScript文档指出以下内容:“从ECMAScript 2015开始,JavaScript具有模块的概念。TypeScript共享此概念。”)