在这里,发生奇怪的事情,使用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
。
对于确定的修复程序,将编译器选项设置为esModuleInterop
,true
并使用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模块。
注意:新行为将添加到标志下,以避免不必要地破坏现有代码库。我们强烈建议将其应用于新项目和现有项目。对于现有项目,名称空间导入(import *如“ express”的express ;; express();)将需要转换为默认导入(import express from“ express”的express ;; express();)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句