ChatGPT解决这个技术问题 Extra ChatGPT

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

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

// 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/…
这似乎也是一个解决方案stackoverflow.com/questions/60925133/…

E
Ericgit

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

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

另外,export {} 是一种方便的方法,可以在不导入任何内容的情况下使文件成为模块。


如果您不想要 isolatedModules,只需将它们设置为 false
这就像添加一些规则,然后通过添加 @ts-ignore 忽略它。 export {} 只是一种不同的语法,绕过规则的方式,但原则上就是这样。
我认为 99% 的时间都遵循一般规则没有问题,但有时需要打破。不得不“打破规则”,只要规则通常是好的,它就会迫使我思考我在做什么,并考虑是否有更好的方法来解决问题。有时没有。就像在这种情况下,我只是制作一个测试文件来尝试一些东西。
@Titian Cernicova-Dragomir,遗留脚本文件是什么?你能举个例子吗?
在我的情况下,我只需要为导出的变量提供与文件名相同的名称 - 它已修复!您可能需要重新启动开发服务器。
W
Wojciech Bednarski

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

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

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


正如其他评论中所解释的,在这种特殊情况下,它不会被视为代码异味,这是这里的必需品,因为没有其他方法可以从 isolutedModules 规则中部分排除某些文件
嗯,当我从 true 变为 false 时,我被告知回复:TypeError:无法在 verifyTypeScriptSetup 处分配给对象 '# ' 的只读属性 'isolatedModules'
@JerryAsher 同样在这里,但它更早地工作,然后我恢复了一些代码并尝试运行它,这就是我得到完全相同的错误的时候。
这对我不起作用,因为我收到了这条消息:The following mandatory changes were made to your tsconfig.json: - isolatedModules was set to true (requirement for SWC / Babel)
S
Sebastian Voráč

尽管您从那个“错误文件”中导出了东西,但仍然有错误?

检查您是否不导出已在另一个文件中导出的相同名称(冲突)修复后尝试停止并启动您的 npm/yarn 运行器(我经历过即使在页面硬重新加载后它也无法自行恢复,尤其是当您有其他地方的另一个错误)


或者在我的情况下: 3. 确保没有您错误检查的同名空文件
L
LSR

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

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

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

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

Source 1

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

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

默认情况下,ts-jest 在项目(你的)上下文中使用 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 }` 但是,如果我只是从另一个文件导入它也会将其转换为模块然后这个没有必要。
Z
ZYinMD

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


V
Vaibhav Singh

不如.eslintignore添加你需要从eslint忽略的文件夹,这样就不会出现任何错误--isolatedModules错误被任何导入修复,你可以测试你的逻辑


A
Arison

问题解决,见文章 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