Typescript: --isolatedModules和没有名称空间的“无法编译名称空间”错误

创建于 2017-04-17  ·  52评论  ·  资料来源: microsoft/TypeScript

TypeScript版本:每晚(2.3.0-dev.20170417)

function f() {}

预期行为:

没有错误,或者关于--isolatedModules项目中非模块文件的错误消息。

实际行为:

src/a.ts(1,1): error TS1208: Cannot compile namespaces when the '--isolatedModules' flag is provided.

发生这种情况是因为我们在program.ts verifyCompilerOptions中查找不是外部模块声明的任何源文件,并且不管第一个文件是什么,都会失败。
错误消息应该升级以反映我们发出此错误的真正原因,而不是提及名称空间。
或者,我们可以只允许文件不导入,并在添加此错误之前实际寻找名称空间。

Bug Error Messages help wanted

最有用的评论

A global file cannot be compiled using '--isolatedModules'. Ensure your file contains imports, exports, or an 'export {}' statement.

所有52条评论

该错误消息需要更清晰。 而不是namespaces可以说non-module@DanielRosenwasser建议?

在这种情况下不应出现错误消息。 --isolatedModules选项应该只完全关闭内部模块系统,如果tsc仍然以这种方式出错,则该选项没有起作用。

在#15839中,我打算修改检查行为,但后来意识到该检查是没有意义的,理想的解决方案是将其删除。
Typescript始终允许在--isolatedModules外部模块中使用名称空间:

export function something() {} // export found, so this module is considered 'external'
namespace ns {} // namespace is still valid in an external module

因此,在应该抱怨的情况下,该检查没有采取任何措施(看似无效)。 那么,当程序员甚至不使用任何名称空间,却没有做错什么时,为什么还要抱怨呢?

@wilonth出现此问题的原因是错误消息是错误的:如果(es6)模块的一部分包含名称空间,但任何非模块文件都应该是错误的,这是完全可以的。

@ andy-ms我试图指出,检查该错误的整个代码是没有意义的,我们应该删除它,而不是使代码更加复杂。
我的观点是,当--isolatedModules打开时,每个文件都应视为一个外部(ES6)模块,即句点。 从这个意义上讲,命名空间的使用应该是合法的,因为现在,在ES6模块(使用--isolatedModules启用)中使用命名空间是完全合法的。

我的观点是,当--isolatedModules打开时,每个文件都应视为一个外部(ES6)模块。

这里的语义是模块是具有至少一个顶级导入或导出的文件。 调用编译器的方式无关紧要。

@mhegazy是的,该规则正是我们在这里--isolatedModules拒绝该文件。
现在,我们不应该更改规则,因为这可能会破坏很多事情,但是仅通过删除此错误消息,我们就可以很轻松地解决当前问题。
让我们想象一下,该“无法编译名称空间”错误消息被删除了,怎么可能出问题了? 使用内部模块(例如Typescript编译器本身)的代码库又如何呢? 启用--isolatedModules后,它会编译为垃圾代码并使用户感到困惑吗? 不,不是这样,会有很多关于未定义符号的Typescript错误消息,因为--isolatedModules打破了文件之间的链接,这很容易理解。
在删除此错误消息后,您还能找到任何不利之处吗? 我不能我们为什么不选择最简单的解决方案呢?它需要零工作(只需删除生产线)并且没有不利之处?

启用--isolatedModules时,它将编译为垃圾代码并使用户感到困惑吗? 不,那不会

是的,它会。

--isolatedModules标志的作用是验证程序可以通过单文件编译成功编译。

无法通过单文件转译成功地编译TypeScript代码库。 到处都有这样的代码:

文件1

namespace ts {
  export var x = 10;
}

文件2

namespace ts {
  var y = x; // transpiles to ts.x during whole-program compilation
}

如果我们对转译的file2进行单文件处理,则会损坏。

不好,我搞砸了测试。 我特此撤回我的提议。 谢谢@RyanCavanaugh的提醒。

因此,解决方案应该是:在抛出此错误消息之前检测实际的名称空间使用情况(即@ andy-ms提出的“替代”解决方案)。 我们不能仅仅将文本更改为其他内容,因为在这种情况下,错误消息是完全错误的。
我想进行公关,但在吐出所有这些胡扯之后,我仍然可以在这里得到信任吗?

A global file cannot be compiled using '--isolatedModules'. Ensure your file contains imports, exports, or an 'export {}' statement.

如果我们对转译的file2进行单文件处理,则会损坏。

对不起,很抱歉,但是可以肯定的是,在定位模块时,它会失败,并出现'x' is not defined ? 在我看来,这种情况与平凡无异:

文件1

var x = 10;

文件2

var y = x;

当连接/全局求值而不是模块时也可以使用; 与namespaces无关。

本质上,为什么打字稿应该已经从module编译器选项中知道了,为什么打字稿会费心地猜测没有importexport文件不是模块呢? 例如,Typescript本身无需设置module即可进行编译,因此它使用的是默认的none ,因此编译器可以假定进行串联/全局求值。

当使用--module <something>并使用其他文件中未导入的声明时(包括名称空间本身),打字稿将在--isolatedModules之前以“未定义”失败,而在export {}之后则失败

我确实注意到,由于某种原因,您仍然可以将import / export--module none --isolatedModules ,这很令人困惑,可能是错误?

@DanielRosenwasser作为最终用户:“全局文件”是什么意思? 我喜欢指导。 也许更像是“没有任何导入或导出语句的文件不是模块,不能使用'--isolatedModules'进行编译。如果仅根据副作用评估此文件,请添加'export {}'语句。” -尽管那里的语言似乎不是很错误-y。

我在一个简单的js项目中看到了相同的错误。 我刚刚创建了一个示例js项目,下面是程序包和脚本文件的内容。 我该如何解决这个问题?

Package.json
{
“ plnkr”:{
“运行时”:“系统”
}
}

lib / script.js
//
//二十一点
//来自Dheeraj Kumar
//

让card1 =“黑桃A”,
card2 =“十个心”;

console.log('欢迎来到二十一点!');

console.log(“您被告知:”);
conosle.log(“” + card1);
console.log(“” + card2);

有任何更新吗?

我经常在小型测试中发现自己正在这样做。

describe('jest', () => {
  it('finds this test', () => {
    expect(true).toBeTruthy();
  });

  it('parses this typescript', () => {
    const actual: number = 0;
    const expected: number = 0;
    expect(actual).toEqual(expected);
  });
});

export {
  // Use an empty export to please Babel's single file emit.
  // https://github.com/Microsoft/TypeScript/issues/15230
}

我真的想要一个使TypeScript将每个.ts文件视为ES6模块的选项,而不管它是否包含import / export语句。 我最初以为--isolatedModules选项就是该选项,但是它会导致在导入/导出较少的文件上出现这个极为混乱的错误。 (我仍然不明白错误消息对名称空间的含义。我不认为我正在使用该功能。)我想要此设置的原因是因为TypeScript遇到了一些问题,因为我不小心引用了尽管使用node / parcel / webpack的文件无法互相引用,但另一个.ts文件中的顶级变量(两者都没有导入/导出语句,因此TypeScript不会将它们视为ES6模块)。这样的未导出变量。

我在这里尝试解决一些烦恼时感到不安。 以下注释仅是为了帮助其他VS Code用户使用create-react-app和TypeScript搜索此错误。

使用create-react-app 2.x和TypeScript配置代理时,您将添加一个名为setupProxy.js ,其代码如下:

const proxy = require('http-proxy-middleware');
module.exports = function(app) { /* ... */ };

react-scripts在ts编译过程之外读取此文件,因此它必须是纯js。

它的工作原理与所记录的完全相同,但具有令人讨厌的副作用。

tsconfig.json生成的react-scripts包括src所有文件,包括setupProxy.js 。 结果,它触发VS代码在setupProxy.js显示Cannot compile namespaces...错误,并用红色花体标记代码并将其包括在“问题”窗格中。 在我的设置中,它还以红色突出显示该文件及其所有祖先文件夹。

解决方案:通过排除tsconfig.json中的setupProxy.js文件来抑制VS Code错误消息。

{
  // ...
  "exclude": ["src/setupProxy.js"]
}

react-scripts强制isolatedModules: true ,但是它似乎不会覆盖exclude

备选:将命名导出添加到`setupProxy.js:

export const _ = '';

对于顶层导出,它现在对--isolatedModules有效。

开发人员通常会收到此消息,因为有些文件不应包含在复制中(gulp.js等)

注意-如果您使用的是create-react-app,并且您看到的问题像我一样...我可以通过更改tsconfig.json文件来绕过此问题...。

改变以下

    "isolatedModules": true,

    "isolatedModules": false,

@UncleFifi然后错误从类型检查转移到babel打字稿转换,请参阅第一个警告

@jtbennett,您只可以使用export {}; - export { name, localName as exportName };的简并形式完全不输出任何内容

@UncleFifi然后错误从类型检查转移到babel打字稿转换,请参阅第一个警告

仅当您实际使用名称空间时。 这个问题主要是关于这个错误的抱怨,当您甚至不使用名称空间,并且碰巧有一个带有导入/导出的合法文件时,就会出现名称空间错误。

仅当您实际使用名称空间时。 这个问题主要是关于这个错误的抱怨,当您甚至不使用名称空间,并且碰巧有一个带有导入/导出的合法文件时,就会出现名称空间错误。

是的,很抱歉-自阅读此主题已有一段时间了! 就是说,他们在CRA中设置--isolatedModules的原因是,它紧密地模仿了babel打字稿的局限性(因为babel也是单文件转译),因此您至少应该意识到,您正在删除该防护-轨。

那么,当前的错误解决方案是在文件顶部添加export {};来错误Cannot compile namespaces when --isolatedModules flag is provided吗?

是的,可以解决此问题。 (假设您实际上并没有使用TypeScript namespace 。否则,您会遇到其他问题,并且可能是合法问题。)

由于一个文件为“空”文件(即整个文件都被注释掉了),因此刚好遇到此消息。 我很高兴TS抓住了这个问题,但是错误消息却非常不透明(并且颜色在普通的CentOS 7安装程序上被破坏了,但这可能是由于webpack开发服务器,与TS不直接相关)

screen shot 2019-02-06 at 14 20 14

_Edit:无法复制。 我肯定盯着只包含三个顶级导出文件的文件,但出现了此错误,但是很显然,我在其他地方做错了。

这个错误只是发生在具有顶级导出文件的文件上。

// Cannot compile namespaces:
export const foo = 'foo';

// Compiles fine
const foo = 'foo';
export { foo };

@ denis-sokolov明显的问题:该文件中是否还有其他内容,例如名称空间?

如果从字面上看只是export const ,我的第二个猜测是打字稿正在使用带有ts-loader的webpack之类的东西,并且仅在扩展export上一遍(例如babel-loader)之后才看到内容

我无法再复制它。 抱歉, @ simonbuchan发出了误报。

不知道为什么我在该特定文件上收到此错误。
其他文件运行正常

screen shot 2019-02-18 at 12 49 07
screen shot 2019-02-18 at 12 48 34

我处于使用CRA TypeScript并导入没有@types的程序包的情况。 我想添加declare module 'package'以提供自己的类型,但是无法将此语句放入任何模块文件中。 因此,我继续创建types.ts来放置declare module语句。 现在我得到这个错误。

当我将isolatedModules覆盖false ,CRA会立即将其改回给我。 那不是解决方案。

当我添加export {}types.ts与文件declare module ,我得到了增强无效的模块名称。 代替。 通过将声明放入非模块文件中可以避免此错误,但是通过强制执行isolatedModules设置的CRA会强制每个文件成为模块!

因此,存在一种解决一个错误的循环路径,该错误只能落在另一个错误上并返回。 如何解决?

@Bnaya猜测,有效的文件正在使用导入或导出语句? 在代码中仅使用require()/module.exportsimport/export之一。 否则,请检查tsconfig include是否覆盖了所有文件(有关详细信息,请参阅文档

出于这个原因, @TomasHubelbauer模块声明应放在.d.ts中。
我只有CRA重新添加了我删除的设置,没有将它们改回来,但是也许对isolatedModules更坚持吗?

@simonbuchan我尝试了一个.d.ts但对我也不起作用,我将向您报告确切原因,但不确定是什么原因。 实际上,CRA为我重写了该设置。

@simonbuchan我已经尝试过上述所有方法-无济于事:(

@simonbuchan嗯,所以.d.ts可以工作,我可以在那里声明模块并键入它。 我最初放弃它的原因是,对于那些要在该模块中声明的类型,我需要引用其他类型,但是在.d.ts文件中引入import会使它停止工作。 我不知道如何解决此问题,但这是我缺乏TypeScript知识,而该知识已不再与此错误有关。

这是一个最小的repro案例,使用typescript @ next (完整的repo在https://github.com/yang/sandbox-ts-namespaces-error):

src / a.js :(注意,不需要导入/导出关键字)

module.exports = "hello"; // you could really put anything here, e.g. console.log('hello');

tsconfig.js:

{
  "compilerOptions": {
    "allowJs": true,
    "isolatedModules": true,
    "noEmit": true,
    "strict": true
  },
  "include": ["src"]
}

错误:

$ ./node_modules/.bin/tsc
src/a.js:1:1 - error TS1208: Cannot compile namespaces when the '--isolatedModules' flag is provided.

1 module.exports = "hello";
  ~~~~~~


Found 1 error.

我也首先通过create-react-app --typescript遇到了这个问题,它指示您创建一个setupProxy.js(或setupTests.js)。 CRA还将isolatedModulesallowJs为true。 直到更新的打字稿版本似乎才不是问题(在打字稿3.1.x上,只有更新到3.2.x或3.3.x之后,我才看不到关于setupProxy.js的错误)。

在运行tsc时,将.js文件添加到排除集中的方法是可行的,但是-令人讨厌的-您仍然可以从TS语言服务的编辑器中看到这些文件的错误(尝试了VS Code和Webstorm)。 (这似乎是TS语言服务不遵守排除的一个单独且更普遍的问题,但我无法为此找到一个存在的问题。)为了在编辑器中掩盖此错误,我添加了.d.ts文件* .js文件。

此外,要求或导入.js文件也会导致排除无效,从而导致引发错误(在编辑器外部)。

似乎只有禁用allowJs(针对create-react-app的建议)对我有用。

我的网络工作者一直收到此错误。

我尝试排除单个文件或文件夹,但它对我不起作用。

没有办法覆盖此isolatedModules设置,CRA不断重写tsconfig.json。

还有其他建议吗?

@jamespfarrellexport {};放在文件中。

@Macil感谢您的建议。

我收到此错误:

尝试导入错误:“ ./ workers / HeartBeat.worker.js”不包含默认导出(导入为“ HeartBeatWorker”)。

如果我添加:

export default {};

我得到:

未捕获的TypeError:_workers_HeartBeat_worker_js__WEBPACK_IMPORTED_MODULE_2 __。default不是构造函数

如果不是针对一个文件,甚至不是针对所有文件,是否没有一种简单的方法来绕过此“ isolatedModules”?

您现在遇到的那些错误与IsolatedModules设置无关。 如果关闭isolatedModules,您仍然会得到这些错误。

尝试导入错误:“ ./ workers / HeartBeat.worker.js”不包含默认导出(导入为“ HeartBeatWorker”)。

该错误在哪里发生? 听起来您正在尝试导入没有导出文件的默认导出,例如import Foo from './workers/HeartBeat.worker.js'; 。 如果您不想导入默认导出,则将导入行更改为import './workers/HeartBeat.worker.js';

你是对的,那是@Macil ! 谢谢!

_也许其他人也会遇到相同的问题:_我在作为占位符留下的一些文件中出现了相同的错误,但其中没有内容,但是我一直在将它们导入其他文件。 我有空的styles.js文件,该文件已导入另一个组件文件中。

只需添加
image

对于模块定义,我遇到了这个错误,如果有人犯了这个特定的错误,我会不小心加了.ts而不是.d.ts后缀。 修复后必须重新启动服务器。

同样的错误。 我正在使用CRA

在CRA上面临此问题。 我只是忘记了从文件中导出任何内容:
Снимок экрана от 2019-04-22 22-24-04

所以我有这个错误,因为我在项目的根文件夹中有一个.js文件,在我的tsconfig.json文件中,我对此进行了配置:

"compilerOptions": {
    ....
  },
  "include": ["src"],

为此,我不得不将其切换:

"compilerOptions": {
    ....
  },
  "include": ["src/*"],

这样就解决了,但是我不明白为什么,有人可以向我解释吗? 我的理解是,包括src将消除根文件和同级文件夹。

@thitemple您从某处的文章中获得了/ *片段吗? Webpack手册似乎表明第一个是正确的。 我正在诊断类似的问题,并且偶然发现了您的帖子。

@ vort3xxx我没有。 我从@DaviSpindola看到了这篇帖子https://github.com/microsoft/TypeScript/issues/15230#issuecomment -479730947并尝试了它。 就是这样

@ vort3xxx我没有。 我从@DaviSpindola看到了#15230(评论)帖子,并尝试了它。 就是这样

同样的问题,同样的解决方案。 TS 3.5.2。

@ThomasdenH

@simonbuchan我尝试了一个.d.ts但对我也不起作用,我将向您报告确切原因,但不确定是什么原因。 实际上,CRA为我重写了该设置。

遇到完全相同的问题。 您是否曾经想过如何解决这个问题? 在create react应用程序中定义.ts.d.ts声明文件会返回错误All files must be modules when the '--isolatedModules标志。 在开始创建React应用时,将标志设置为false或删除isolatedModules属性将完全重置为true
在声明文件的底部添加export {}导致错误: Invalid module name in augmentation. Module '...' resolves to an untyped module at '...'

有人请帮忙。 如何将自定义声明文件添加到create react app项目中?

只是弄清楚了是否还有其他人遇到同样的问题。 使用create react app时,只需将声明类型添加到源文件夹中的react-app-env.d.ts文件中。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

fwanicka picture fwanicka  ·  3评论

CyrusNajmabadi picture CyrusNajmabadi  ·  3评论

bgrieder picture bgrieder  ·  3评论

manekinekko picture manekinekko  ·  3评论

wmaurer picture wmaurer  ·  3评论