【问题标题】:TypeScript: default is not a constructorTypeScript:默认不是构造函数
【发布时间】:2017-09-22 15:08:11
【问题描述】:

在我的 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”模块的正确方法是什么?

【问题讨论】:

  • 你不能在接口中声明构造函数。
  • 试试:export = UUID;
  • @Paleo,使用export = UUID; 在写new UUID(4).format() 时显示error TS2693: 'UUID' only refers to a type, but is being used as a value here.

标签: typescript import module export typescript-typings


【解决方案1】:

试试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');

【讨论】:

  • 感谢您的提示。如果我这样做,我会收到以下错误:error TS1192: Module '"../node_modules/pure-uuid/uuid"' has no default export..
  • @BennyNeugebauer 我编辑了。 const UUID = require ... 等价于 import * as UUID from ...
  • 我尝试将 const 切换到 import 但 TS 3.4 抱怨。有效的是const package = require("package").default;
【解决方案2】:

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

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

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

【讨论】:

  • 使用const UUID = require('pure-uuid'); 时,我失去了基于UUID 的类型和自动完成的好处。
【解决方案3】:

我在这里添加这个答案,因为这个问题中的错误可能会弹出 有许多 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 共享这个概念。”)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2012-06-30
    • 2016-07-23
    • 2013-05-06
    • 2023-03-20
    • 2010-10-30
    • 2014-05-15
    相关资源
    最近更新 更多