打字稿名称生成机制

时间:2017-02-15 16:11:24

标签: typescript tsc

我们正在尝试组织一个较旧的软件包。为此,我们开始将原始“export = module”表单更改为“export default module”。此更改会破坏使用eval()的代码的其他部分,因为“import module from 'module'”正在编译为“module_1”。提供给eval()的代码来自外部源,而我们想要使用模块,而不是“module_1.default”形式。

这种命名约定实际上如何运作?您能告诉我们这个概念吗?我们如何使用原始模块名称而不是编译的名称?或者是否有编译后获取模块实际名称的函数?

谢谢, 亚当

1 个答案:

答案 0 :(得分:1)

使用编译器生成的名称是不安全的。它可以改变。

解决方法

但你可以这样做:

import myModule from 'module'
const module = myModule

第二行将编译为:

var module = module_1.default;

然后,您可以使用变量module

为何使用export default而不是export =

在不久的将来,使用export default将成为常态。此功能由ECMAScript设计,以替换当前的CommonJS用例。成员default更好,更通用。

这是一个例子。您需要导出一个对象:

const myConfigObject = Object.freeze({
    dbHost: "",
    dbUser: "",
    // ...
})
export = myConfigObject

然后,您可以导入它:

import * as myConfigObject from "./myConfigObject"

随后,您希望导出一个小帮助函数toDSN,帮助模块用户执行与导出对象相关的操作。怎么做?您可以将帮助程序添加为配置的成员。但它不会优雅。

以下是ES6方式:

export default Object.freeze({
    dbHost: "",
    dbUser: "",
    // ...
})
export function toDSN(configObj) {
    return // ...
}

然后,您可以导入默认对象:

import myConfigObject from "./myConfigObject"

...或导入toDSN

import { toDSN } from "./myConfigObject"

...或导入两者:

import myConfigObject, { toDSN } from "./myConfigObject"

唯一的小缺陷是当前Node.js用户代码:必须使用成员default。当Node.js实现ES6模块时,陷阱就不再存在了。

为什么TS编译器会为导入生成中间变量?

因为ES6模块的一般情况需要它。以下ES6代码:

import myConfigObject, { toDSN } from "./myConfigObject"

此处导入两个变量。但是CommonJS(或AMD)require只能导入一个变量。因此,编译器将此单个变量作为中间变量myConfigObject_1导入。然后,通过myConfigObject可以使用对象myConfigObject_1.defaulttoDSN可以使用myConfigObject_1.toDSN

我建议the article from Mozilla介绍ES6模块。