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

前端之家收集整理的这篇文章主要介绍了typescript – “…解析为非模块实体,无法使用此构造导入”是什么意思?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一些TypeScript文件

MyClass.ts

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

MyFunc.ts

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

MyConsumer.ts

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

这使我尝试使用新的错误

Module “MyClass” resolves to a non-module entity and cannot be imported using this construct.

当尝试调用fn()

Cannot invoke an expression whose type lacks a call signature.

是什么赋予了?

解决方法

为什么它不起作用
import * as MC from './MyClass';

这是ES6 / ES2015风格的导入语法.其确切含义是“从./MyClass加载的模块命名空间对象并将其本地用作MC”.值得注意的是,“模块命名空间对象”仅由具有属性的普通对象组成. ES6模块对象不能作为一个函数或新的被调用.

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

使用*作为X从模块导入的东西被定义为只具有属性.在下级的CommonJS中,这可能不会被完全尊重,但是TypeScript会告诉你标准定义的行为.

什么工作?

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

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

如果您同时控制这两个模块,可以使用导出默认值:

MyClass.ts

export default class MyClass {
  constructor() {
  }
}

MyConsumer.ts

import MC from './MyClass';

我很伤心规则是愚蠢的

这将是很好的使用ES6导入语法,但现在我必须这样做导入MC = require(‘./ MyClass’);事情?这是2013年!瘸!但悲伤是编程的正常部分.请跳到库伯勒 – 罗斯模型的第五阶段:验收.

这里的TypeScript告诉你这不工作,因为它不起作用.有一些黑客(为MyClass添加一个命名空间声明是一种流行的方式来假装这个工作),并且它们今天可能在你的特定的下级模块绑定器(例如汇总)中工作,但这是虚幻的.在野外没有任何ES6模块实现,但永远不会是真的.

展现未来的自我,试图运行在一个neato本机ES6模块实现,并发现您已经设置了自己的重大失败,尝试使用ES6语法来做一些ES6显然不做的事情.

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

也许你有一个模块加载器,当没有存在时,“有帮助”创建默认导出.我的意思是,人们为了理由而制定标准,但忽略标准是有趣的,我们可以认为这是一件很酷的事情.

将MyConsumer.ts更改为:

import A from './a';

并指定allowSyntheticDefaultImports命令行或tsconfig.json选项.

请注意,allowSyntheticDefaultImports根本不会更改代码的运行时行为.它只是一个告诉TypeScript的标志,当不存在时,您的模块加载器创建默认导出.它不会神奇地使您的代码工作在nodejs以前没有.

原文链接:https://www.f2er.com/js/150504.html

猜你在找的JavaScript相关文章