Typescript “什么是……”;。。。解析为非模块实体,无法使用此构造导入;什么意思?
我有一些类型脚本文件: MyClass.ts MyFunc.ts 支原体 尝试使用Typescript “什么是……”;。。。解析为非模块实体,无法使用此构造导入;什么意思?,typescript,ecmascript-6,es6-modules,Typescript,Ecmascript 6,Es6 Modules,我有一些类型脚本文件: MyClass.ts MyFunc.ts 支原体 尝试使用new 模块“MyClass”解析为非模块实体,无法使用此构造导入 当尝试调用fn() 无法调用其类型缺少调用签名的表达式 有什么好处?为什么不起作用 这是ES6/ES2015样式import语法。其确切含义是“将从/MyClass加载的模块名称空间对象作为MC本地使用”。值得注意的是,“模块名称空间对象”仅由具有属性的普通对象组成。ES6模块对象不能作为函数或与new一起调用 再说一遍:ES6模块名称空间对象不能
new
模块“MyClass”解析为非模块实体,无法使用此构造导入
当尝试调用fn()
无法调用其类型缺少调用签名的表达式
有什么好处?为什么不起作用
这是ES6/ES2015样式import
语法。其确切含义是“将从/MyClass
加载的模块名称空间对象作为MC
本地使用”。值得注意的是,“模块名称空间对象”仅由具有属性的普通对象组成。ES6模块对象不能作为函数或与new
一起调用
再说一遍:ES6模块名称空间对象不能作为函数调用,也不能与new
从模块中使用*as X
导入的对象被定义为仅具有属性。在降级的CommonJS中,这可能没有得到充分尊重,但TypeScript告诉您标准定义的行为是什么
什么有效?
要使用此模块,您需要使用CommonJS样式的导入语法:
import MC = require('./MyClass');
如果您同时控制这两个模块,则可以使用导出默认值
:
MyClass.ts
支原体
我对此感到难过;规则是愚蠢的。
使用ES6导入语法会很好,但现在我必须这样做import MC=require('./MyClass')代码>东西?真是太棒了!瘸的但悲伤是编程的正常部分。请跳到Kübler-Ross模型的第五阶段:接受
这里的TypeScript告诉你这不起作用,因为它不起作用。有一些黑客(将名称空间
声明添加到MyClass
是一种很流行的假装这种方法有效的方式),它们今天可能在您特定的降层模块绑定器(例如rollup)中起作用,但这是虚幻的。目前还没有任何ES6模块的实现,但这不会永远是真的
想象一下你未来的自己,尝试在neato原生ES6模块实现上运行,发现你已经准备好使用ES6语法来做ES6显式不做的事情,从而导致重大失败
我想利用我的非标准模块加载器
也许您有一个模块加载器,它“有帮助地”创建default
exports(当不存在时)。我的意思是,人们制定标准是有原因的,但忽视标准有时很有趣,我们可以认为这是一件很酷的事情
将MyConsumer.ts更改为:
并指定allowSyntheticDefaultImports
命令行或tsconfig.json
选项
请注意,allowSyntheticDefaultImports
根本不会更改代码的运行时行为。它只是一个标志,告诉TypeScript模块加载程序在不存在导出时创建default
导出。它不会神奇地让你的代码在nodejs中工作,而以前没有。在这里添加我的2美分,以防其他人有此问题
我在不修改tsconfig.json
的情况下解决这个问题的方法(在某些项目中可能会有问题),我只是简单地禁用了oneline的规则
import MC=require('./MyClass');//tslint:disable line
我在项目中尝试包含npm去盎司包时遇到此错误
当我尝试上面接受的解决方案时,我遇到了一个异常:
以ECMAScript模块为目标时无法使用导入分配。
考虑从“mod”,“导入{a}”从“mod”中使用“导入*为ns”,
'从“mod”导入d',或改为其他模块格式
这最终奏效了:
import debounce from 'debounce'
TypeScript 2.7通过发出新的助手方法引入支持:
因此,在tsconfig.json中添加以下两个设置:
{
// Enable support for importing CommonJS modules targeting es6 modules
"esModuleInterop": true,
// When using above interop will get missing default export error from type check since
// modules use "export =" instead of "export default", enable this to ignore errors.
"allowSyntheticDefaultImports": true
}
现在您可以使用:
import MyClass from './MyClass';
谢谢分享答案。我建议删除javascript
作为主标记,并保留ecmascript-6
,因为这里的主标记是typescript
。该问题错误地假设导出=
(TS功能)可能与导入配对。。。从
,同时。它基本上是ES6模块导入/导出vs CJS/AMD。commonjs样式不需要commonjs目标吗?当您以es6/es2015为目标时,有没有办法让它起作用?您不能让它以es6为目标,因为它在es6中不起作用…我的理解正确吗?如果我以es2015模块为目标,就没有办法引用具有export=MyClass
的CommonJS模块?我唯一的选择是将我的模块设置为commonjs
,并通过不使用现代ES继续让世界变得更糟。在--esModuleInterop
下,它说“我们强烈建议将其应用于新项目和现有项目”。在我看来,这个答案(以及链接在这里的DefinitelyTyped
)应该修改以反映新的立场。因此非常时髦。我没有使用esModuleInterop
,而是使用了resolveJsonModule
以及您关于使用allowSyntheticDefaultImports
的其他建议,它对我起了作用。
import MC = require('./MyClass');
export default class MyClass {
constructor() {
}
}
import MC from './MyClass';
import A from './a';
import debounce from 'debounce'
{
// Enable support for importing CommonJS modules targeting es6 modules
"esModuleInterop": true,
// When using above interop will get missing default export error from type check since
// modules use "export =" instead of "export default", enable this to ignore errors.
"allowSyntheticDefaultImports": true
}
import MyClass from './MyClass';