为啥任何导入都修复了 --isolatedModules 错误?

Posted

技术标签:

【中文标题】为啥任何导入都修复了 --isolatedModules 错误?【英文标题】:Why is --isolatedModules error fixed by any import?为什么任何导入都修复了 --isolatedModules 错误? 【发布时间】:2019-10-27 20:28:53 【问题描述】:

在一个 create-react-app 打字稿项目中,我试图写这个只是为了快速测试一些东西:

// experiment.test.ts
it('experiment', () => 
  console.log('test');
);

但它给了我以下错误,it 下方有一个红色波浪线:

如果提供了“--isolatedModules”标志,所有文件都必须是模块。

但是,如果我将文件更改为以下内容,那么一切显然都很好(当然除了未使用的导入):

// experiment.test.ts
import  Component from 'react'; // literally anything, don't even have to use it

it('test', () => 
  console.log('test');
);

为什么?这里发生了什么? --isolatedModules 究竟是什么意思/做什么?

【问题讨论】:

如果您使用的是importexport,那么该文件就是一个ES6 模块。您的***示例存在问题,因为 it 未在任何地方定义,在模块化架构中,您需要从某处导入 it @apokryfos 这个链接应该可以帮助medium.com/bb-tutorials-and-thoughts/… 这似乎也是一个解决方案***.com/questions/60925133/… 【参考方案1】:

Typescript 将没有导入/导出的文件视为遗留脚本文件。由于此类文件不是模块,因此它们已合并到全局命名空间中的任何定义。 isolatedModules 禁止此类文件。

将任何导入或导出添加到文件使其成为模块并且错误消失。

export 也是一种方便的方法,无需导入任何内容即可将文件变成模块。

【讨论】:

谢谢,这很简单,但是当您创建第一个测试时,您会被错误弄糊涂。 @JuanguiJordán 太容易错了。如果您不想要isolatedModules,只需将它们设置为false 谢谢@WojciechBednarski,但你能详细说明你的答案吗? @JuanguiJordán 好吧,这就像添加一些规则,然后通过添加@ts-ignore 忽略它。 export 只是一种不同的语法,绕过规则的方式,但原则上就是这样。 我认为 99% 的时间都遵循一般规则没有问题,但有时需要打破这些规则。不得不“打破规则”,只要规则通常是好的,它就会迫使我思考我在做什么,并考虑是否有更好的方法来解决问题。有时没有。就像在这种情况下,我只是制作一个测试文件来尝试一下。【参考方案2】:

正确的方法是告诉 TypeScript 你想要什么。如果您不希望 isolatedModules 在您的 test 目录中创建 tsconfig.json 并添加:


  "extends": "../tsconfig.json",
  "compilerOptions": 
    "isolatedModules": false
  ,

"isolatedModules": true 添加到配置中,然后通过添加空的export 来欺骗TypeScript 检查器,这对我来说是不好的代码。

【讨论】:

正如在其他 cmets 中解释的那样,在这种特殊情况下,它不会被视为代码异味,这是必要的,因为没有其他方法可以从 isolutedModules 规则中部分排除某些文件 嗯,当我从 true 变为 false 时,我被告知回复:TypeError: Cannot assign to read only property'isolatedModules' of object '# ' at verifyTypeScriptSetup @JerryAsher 和这里的人一样,但它之前工作过,然后我恢复了一些代码并尝试运行它,这时我得到了完全相同的错误。【参考方案3】:

让我们尝试检查孤立的模块。当我检查谷歌时,没有直接的上下文。

这基本上意味着您允许 Typescript 单独编译模块。

但它来自 Typescript,并且与 Typescript 更喜欢模块而不是命名空间有关。

模块还依赖于模块加载器(例如 CommonJs/Require.js) 或支持 ES 模块的运行时。模块 提供更好的代码重用、更强的隔离和更好的工具 支持捆绑。

Source 1

使用 create-react-app 打字稿项目, 您应该已经安装了 typescript 和 ts-jest(或者 create-react-app 应该根据您是否弹出应用程序来处理依赖项)。

ts-jest 也有一些关于它的信息:

默认情况下 ts-jest 在 a 的上下文中使用 TypeScript 编译器 项目(你的),具有完整的类型检查和功能。但也可以 用于分别编译每个文件,TypeScript 称之为 “隔离模块”。这就是 isolatedModules 选项(其中 默认为 false) 会。

Source 2

一旦您使用export 命令,您就可以从正在导出的内容中创建一个模块。

如果您使用的是 ts-jest,您可以添加这些设置而不会影响您的其他模块,create-react-app 将包含这些模块。

"ts-jest": 
  "isolatedModules": false

并查看 ts-jest 页面(第二个来源)以了解赞成和反对的观点。

【讨论】:

在我的 jest.config.js 中执行此操作解决了它 -- ` 'ts-jest': tsconfig: isolatedModules: false ` 但是,如果我只是从另一个文件导入它也将其转换为模块,然后这不是必需的。【参考方案4】:

尽管您从该“错误文件”导出内容,但仍然有错误?

    Check if you don't export same name that you already export in another file(冲突) After your fix try to stop and start your npm/yarn runner(我经历过即使在硬重新加载页面后它也无法自行恢复,尤其是当您在其他地方出现另一个错误时)

【讨论】:

【参考方案5】:

不如做 .eslintignore 添加您需要从 eslint 忽略的文件夹,因此任何导入都修复了 --isolatedModules 错误 你可以测试你的逻辑他们的

【讨论】:

【参考方案6】:

问题解决,见文章 https://blog.csdn.net/qingfeng812/article/details/120510673


  "compilerOptions": 
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": false,
    "noEmit": true,
    "jsx": "react-jsx"
  ,
  "include": [
    "src"
  ]

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案7】:

那是因为你还没有导入要测试的函数。一旦你这样做,错误就会消失。接受的答案解释了原因。

【讨论】:

以上是关于为啥任何导入都修复了 --isolatedModules 错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复当我尝试导入任何东西时看到的 Jupyter 笔记本中的错误

TypeError:无法读取未定义的属性“获取”(修复冲突导入不起作用)

为啥除了 jnius 我不能导入任何 pyjnius 的东西?

电脑桌面上的文件名称都变成一样了,是为啥?有办法修复吗?

为啥我的电脑浏览器可以打开,而其他软件打不开

为啥 javax.websocket 不能解决?