在一个 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
的实际含义/作用是什么?
import
或 export
,则该文件是 ES6 模块。您的顶级示例是有问题的,因为 it
没有在任何地方定义,在模块化架构中,您需要从某个地方导入 it
Typescript 将没有导入/导出的文件视为遗留脚本文件。由于此类文件不是模块,因此它们已合并到全局命名空间中的任何定义。 isolatedModules
禁止此类文件。
将任何导入或导出添加到文件使其成为模块并且错误消失。
另外,export {}
是一种方便的方法,可以在不导入任何内容的情况下使文件成为模块。
正确的方法是告诉 TypeScript 你想要什么。如果您不希望 isolatedModules
在 test
目录中创建 tsconfig.json
并添加:
{
"extends": "../tsconfig.json",
"compilerOptions": {
"isolatedModules": false
},
}
将 "isolatedModules": true
添加到配置中,然后通过添加空的 export {}
来欺骗 TypeScript 检查器,这对我来说是不好的代码。
The following mandatory changes were made to your tsconfig.json: - isolatedModules was set to true (requirement for SWC / Babel)
尽管您从那个“错误文件”中导出了东西,但仍然有错误?
检查您是否不导出已在另一个文件中导出的相同名称(冲突)修复后尝试停止并启动您的 npm/yarn 运行器(我经历过即使在页面硬重新加载后它也无法自行恢复,尤其是当您有其他地方的另一个错误)
让我们尝试检查孤立的模块。当我检查谷歌时,没有直接的上下文。
这基本上意味着您允许 Typescript 单独编译模块。
但它来自 Typescript,并且与 Typescript 更喜欢模块而不是命名空间有关。
模块还依赖于模块加载器(例如 CommonJs/Require.js)或支持 ES 模块的运行时。模块为捆绑提供了更好的代码重用、更强的隔离和更好的工具支持。
使用 create-react-app typescript 项目,您应该已经安装了 typescript 和 ts-jest(或者 create-react-app 应该根据您是否弹出应用程序来处理依赖项)。
ts-jest
也有一些关于它的信息:
默认情况下,ts-jest 在项目(你的)上下文中使用 TypeScript 编译器,具有完整的类型检查和功能。但它也可以用于单独编译每个文件,TypeScript 称之为“隔离模块”。这就是 isolatedModules 选项(默认为 false)的作用。
只要您使用 export
命令,您就可以从正在导出的内容中创建一个模块。
如果您使用的是 ts-jest,您可以添加这些设置而不会影响您的其他模块,create-react-app 将包含这些模块。
"ts-jest": {
"isolatedModules": false
}
并查看 ts-jest 页面(第二个来源)以了解专业人士和反对者。
那是因为你还没有导入要测试的函数。一旦你这样做,错误就会消失。接受的答案解释了原因。
不如.eslintignore
添加你需要从eslint忽略的文件夹,这样就不会出现任何错误--isolatedModules错误被任何导入修复,你可以测试你的逻辑
问题解决,见文章 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"
]
}
isolatedModules
,只需将它们设置为false
。@ts-ignore
忽略它。export {}
只是一种不同的语法,绕过规则的方式,但原则上就是这样。