应该不是
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是不同的。这个问题是关于出口和应该是两个等价的用法。另一个问题是关于进口。)
答案 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";