我有一个外部库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在.default
和thing_1
之间添加functionOnThing()
?
default
上没有名为ThingStatic
的属性,default
文件定义的底层JS对象上没有.d.ts
属性。
为什么TypeScript会添加属性以及如何阻止它?
答案 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