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

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

但它给了我以下错误,在它下面有一个红色的弯弯曲曲:

当提供了'——isolatedModules'标志时,所有文件都必须是模块。

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

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

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

为什么?这里发生了什么?——isolatedModules实际上意味着什么?


当前回答

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

向文件添加任何导入或导出都可以使其成为模块,错误就会消失。

export{}也是一种不需要导入任何东西就能使文件成为模块的方便方法。

其他回答

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

以防你不想添加不必要的东西

export {}

到处都是,不想破坏其他文件的编译器选项。

如果您有一个单独的tests/目录,您可以扩展根目录tsconfig文件,并在tests/目录中创建一个新文件。

然后加上这个:

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

这只会关闭测试文件的isolatedModules标志。重新启动代码编辑器以同步更改。

尽管你从“错误文件”中导出东西,仍然有错误?

检查您是否导出了已经在另一个文件中导出的相同名称(冲突) 在你修复后,尝试停止并启动你的npm/yarn runner(我经历过即使在硬重载页面后,特别是当你在其他地方有另一个错误时,它也不能恢复自己)

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

正确的方法是告诉TypeScript你想要什么。如果你不想要isolatedModules,创建tsconfig。Json到你的测试目录,并添加:

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

添加“isolatedModules”:配置为true,然后通过添加空的export{}来欺骗TypeScript检查器,让我觉得代码很糟糕。