“...解析为非模块实体并且无法使用此构造导入”是什么意思?

2023-12-26

我有一些 TypeScript 文件:

MyClass.ts

class MyClass {
  constructor() {
  }
}
export = MyClass;

MyFunc.ts

function fn() { return 0; }
export = fn;

我的消费者.ts

import * as MC from './MyClass';
import * as fn from './MyFunc';
fn();

这在尝试使用时给我带来错误new

模块“MyClass”解析为非模块实体,无法使用此构造导入。

当试图打电话时fn()

无法调用类型缺少调用签名的表达式。

是什么赋予了?


为什么它不起作用

import * as MC from './MyClass';

这是 ES6/ES2015 风格import句法。其确切含义是“将模块命名空间对象加载自./MyClass并在本地使用它作为MC”。值得注意的是,“模块命名空间对象“仅由具有属性的普通对象组成。ES6 模块对象不能作为函数或用new.

再说一遍:ES6 模块命名空间对象不能作为函数调用或使用new.

你的事import using * as X模块中的内容被定义为仅具有属性。在降级的 CommonJS 中,这可能不会得到完全尊重,但 TypeScript 会告诉您标准定义的行为是什么。

有什么作用?

您需要使用 CommonJS 风格的导入语法来使用此模块:

import MC = require('./MyClass');

如果您控制这两个模块,则可以使用export default反而:

MyClass.ts

export default class MyClass {
  constructor() {
  }
}

我的消费者.ts

import MC from './MyClass';

我对此感到难过;规则是愚蠢的。

如果使用 ES6 import 语法就好了,但现在我必须这样做import MC = require('./MyClass');事物?这已经是2013年了!瘸!但悲伤是编程的正常组成部分。请跳至库伯勒-罗斯模型的第五阶段:接受。

TypeScript 在这里告诉你这不起作用,因为它不起作用。有一些技巧(添加一个namespace声明给MyClass是一种流行的假装这种方法有效的方法),并且他们might今天在您的特定下层模块捆绑器(例如 rollup)中工作,但这是虚幻的。目前还没有任何 ES6 模块实现,但这不会永远如此。

想象一下未来的自己,尝试在neato本机ES6模块实现上运行,并发现自己已经为重大失败做好了准备尝试使用 ES6 语法做一些 ES6 明确不做的事情.

我想利用我的非标准模块加载器

也许您有一个“有帮助”创建的模块加载器default当不存在时导出。我的意思是,人们制定标准是有原因的,但有时忽略标准很有趣,我们可以认为这是一件很酷的事情。

Change 我的消费者.ts to:

import A from './a';

并指定allowSyntheticDefaultImports命令行或tsconfig.json option.

注意allowSyntheticDefaultImports根本不会改变代码的运行时行为。它只是一个告诉 TypeScript 你的模块加载器创建的标志default当不存在时导出。它不会神奇地让你的代码在 Nodejs 中工作,而以前却不能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“...解析为非模块实体并且无法使用此构造导入”是什么意思? 的相关文章

随机推荐