在我的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"的正确方法是什么?模块?
答案 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 modules。 Mozilla documentation on Javascript import-statement可能更容易快速浏览。 两种语言AFAIK的语法都相同。 (TypeScript文档指出以下内容:“从ECMAScript 2015开始,JavaScript具有模块的概念。TypeScript共享此概念。”)