关于`export`用法的功能等价的困惑

时间:2018-01-21 17:17:03

标签: javascript node.js typescript

应该不是

import * as convict from "convict";

const config = convict({ ... });

// Perform validation
config.validate({ "allowed": "strict" });

export = config;

在功能上等同于:

import * as convict from "convict";

export const config = convict({ ... });

// Perform validation
config.validate({ "allowed": "strict" });

第一个代码段有效,但第二个代码段引入了类型错误,例如:

TypeError: config.get is not a function

使用以下方式导入时:

import * as config from "./config";

(这个问题和Frequent issue with TypeScript and preferring import over require是不同的。这个问题是关于出口和应该是两个等价的用法。另一个问题是关于进口。)

2 个答案:

答案 0 :(得分:2)

export const config = ...被称为"名为export",它将config变量添加到模块导出的名称列表中。您可以查看es6导出语句here的各种变体,这个特定的变体对应于第一个示例的第4行(注意'还有var,const'注释):

export let name1 = …, name2 = …, …, nameN; // also var, const

可与"名为import * like

一起使用
import {config} from '...';

export = config完全不同,它只是打字稿export assignment。文档说应该导入import config = require(...),这也是仅限于typecript的特殊语法。

使用当前版本的TypeScript,导出分配也可以导入为

import * as config from 'module';

but there is breaking change in the works,将来(可能会尽快2.8)此导入将停止与出口协助合作,并且必须写为

import config from 'module';

答案 1 :(得分:1)

这两者确实不同。从本质上讲,这一切都与第二种情况config是命名导出的事实有关。

第一个代码段产生的导出只是配置。如果您执行了require("./config"),那么您将获得该配置对象。这是因为您将exports对象设置为配置。这就是您导入时必须* as config的原因,因为整个导入的对象都是您希望获得的。

第二个代码段生成一个对象,其中有一个指向您的配置的config字段。这等同于(ish):

exports = {
    config: convict({ ... })
};

在此示例中,config命名导出。要导入它,您必须获取导出对象的config字段:

import { config } from "./config";