Typescript “什么是……”;。。。解析为非模块实体,无法使用此构造导入;什么意思?

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模块名称空间对象不能

我有一些类型脚本文件:

MyClass.ts

MyFunc.ts

支原体

尝试使用
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';