不能调用或构造名称空间样式的导入,并且将在运行时导致失败

约翰·高特(John Gorter):

在这里,发生奇怪的事情,使用TypeScript 2.7.2,在VSCode版本1.21中带有@ types / express及其后继的代码,在某些情况下,VSCode引发错误,指出“无法调用或构造名称空间样式的导入,这将导致运行时失败。”。但是,在具有类似设置和类似tsconfig.json文件的其他计算机上,代码也可以正常工作。在这里发生了什么:

import { Bank } from './Bank';
import * as Express from 'express';  <== errors here..

let app: Express.Express;
this.app = Express();                <== and here

为什么会这样呢?

TIA,

约翰。

胖子

该错误仅在发生esModuleInterop: true也许VSCode忽略了您使用的tsconfig.json另一个esModuleInterop: true

对于确定的修复程序,将编译器选项设置为esModuleInteroptrue并使用import express代替import * as express

问题

ES6规范定义了“命名空间对象”的概念。Namespace对象是namespaceObject在此声明:import * as namespaceObject from 'a-module'typeof对象是object,您不应调用它。

import * as express到目前为止,您一直在使用,因为express它是用于Node.js的CommonJS模块,使用导出module.exports但是,这在ES6规范中是非法的,TypeScript现在会警告您。

解决方案

设置esModuleInterop为true将使TypeScript打包您的import调用以检查该模块是ES6模块还是CommonJS。如果它是CommonJS模块,而您正在使用import default from 'module'TypeScript,则会找出并返回正确的CommonJS模块。

TypeScript发行说明中

注意:新行为将添加到标志下,以避免不必要地破坏现有代码库。我们强烈建议将其应用于新项目和现有项目。对于现有项目,名称空间导入(import *如“ express”的express ;; express();)将需要转换为默认导入(import express from“ express”的express ;; express();)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

构造要在运行时调用的方法的名称

在运行时使用管道名称/ metadata调用管道

如何在运行时获取调用方法的名称

如果应用类型擦除,将在运行时调用哪个重载方法,为什么?

在运行时构造按钮

在运行时导入模块

在运行时替换导入类

Nan::AsyncQueue 在运行时失败

macOS项目在运行时失败

数组将在运行时被赋予值和大小

在运行时调用macroexpand

您可以在运行时在XmlRootAttribute中设置名称空间字段吗?

Serilog,在运行时更改特定名称空间的日志级别(> MinimumLevel)

如何声明对现有名称空间的引用,该名称空间可在运行时从javacript捆绑包获得

即使在运行时堆空间连续可用时,是否总是调用gc?

在运行时从RPN构造一个可调用函数的对象

Python:哪个导入模块正在运行时调用我的函数

如何在运行时的给定调用中找到包名称?

基本构造函数根据输入调用派生的构造函数-在运行时选择对象子类型

XSLT:在运行时将xmlns:prefix属性添加到别名命名空间中的样式表中

Flask Socket-IO运行时未导入,并且导致许多问题,例如无法托管='0.0.0.0'

如何在运行时更改按钮形状样式?

SWT:在运行时更改Shell的样式

如何在运行时调整样式

如何在运行时更改TextView的样式

在运行时更改EditText中的文本样式格式

如何在运行时更新JSF组件的样式

是否可以在运行时更改组件样式?

WPF样式在运行时未应用