TS2306:文件“ ./*.js”不是模块

时间:2020-06-05 16:18:06

标签: javascript typescript

我正在尝试将.js文件导入打字稿文件。 是的,我知道...我也看过其他问题,但我无法弄清楚这个问题。

.js文件是使用canopy生成的,看起来像这样:

(function() {
  'use strict';

   ......

   var exported = { Grammar: Grammar, Parser: Parser, parse: parse };

   if (typeof require === 'function' && typeof exports === 'object') {
      extend(exports, exported);
   } else {
      var namespace = typeof this !== 'undefined' ? this : window;
      namespace.URLP = exported;
   }
})();

我已经声明过输入:

declare namespace URLP {
  function parse(input: any, options?: any): void;
}

declare module '*.js';

我的tsconfig.json具有:

"module": "esnext",
"moduleResolution": "node",
"importHelpers": true,
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true,
"target": "es5",
"typeRoots": ["node_modules/@types"],
"lib": ["es2018", "dom"],
"allowJs": true

如果我使用import { URLP } from './urlp.js';导入.js文件,则会引发以下错误:

error TS2306: File '..../urlp.js' is not a module.        

奇怪的是,我可以加载Web应用程序并在浏览器中使用URLP.parse()方法。

如果我尝试使用import './urlp.js'导入它,则不会出现编译错误,但是在浏览器中URLP变得不确定。

1 个答案:

答案 0 :(得分:0)

此错误表示您没有export JS文件中的任何内容。相反,您使用了全局exports(或module.exports)对象。尝试改用require语法:

const { URLP } = require('./urlp.js');

请注意,这将阻止TypeScript进行静态代码分析来确定编译时导出的内容,因此根本不会键入您在外部JS文件中使用的所有内容。

如果您遇到类似Cannot find name 'require'.的错误,请使用declare function require(path: string): any;