为什么TypeScript将.default添加到全局定义的导入中?

时间:2016-12-14 16:54:33

标签: javascript typescript ecmascript-6 typescript-typings

我有一个外部库thing.d.ts文件,里面有一个全局定义:

declare var thing: ThingStatic;
export default thing;

我在TypeScript中引用了npm模块:

import thing from 'thing';
...
thing.functionOnThing();

当我转换TS(针对ES6)时,它看起来像这样:

const thing_1 = require("thing");
...
thing_1.default.functionOnThing();

然后抛出错误:

  

无法读取未定义的属性'functionOnThing'

为什么TypeScript在.defaultthing_1之间添加functionOnThing()

default上没有名为ThingStatic的属性,default文件定义的底层JS对象上没有.d.ts属性。

为什么TypeScript会添加属性以及如何阻止它?

2 个答案:

答案 0 :(得分:11)

import thing from 'thing';

这行代码表示"从模块default导入'thing'导出并将其绑定到本地名称thing&#34 ;

TypeScript按您的要求执行并访问模块对象的default属性。

你可能想写的是

import * as thing from 'thing';

答案 1 :(得分:2)

这似乎是全局TS定义和"module": "commonjs"tsconfig.json的错误。

您可以使用全局TS定义并将所有输出拼接成单个文件,也可以使用模块直接导入它们。

此处的错误是由于require返回模块上下文,而default的名称无关紧要 - 它总是变为default ...

declare var thing: ThingStatic;
export thing; // Explicit export for thing
export default thing; // Default export for thing

现在require将返回此上下文,因此使用commonjs模块:

import module from 'thing';
var thing = module.default; // From the default export
var alsoThing = module.thing; // From the named export

但是,我发现这是不一致的,所以切换到es6模块:

import thing from './thing'; // Import default
import { thing } from './thing'; // Import named
const thing = (await import('path/to/thing.js')).default; // Import dynamic