仅将 TypeScript 环境声明添加到特定文件(如 *.spec.ts)

Adding TypeScript ambient declarations only to specific files (like *.spec.ts)

My Jest setupTests 文件定义了一些全局标识符(如 global.sinon = sinon,但在环境声明中键入它们适用于所有文件,而不仅仅是 *.spec.ts 其中 setupTests 文件被包含在内。以前我已经通过为 tests 目录创建一个单独的 tsconfig.json 文件来解决这个问题,但是如果测试和非测试文件位于同一目录中,这是不可能的. 有没有办法让环境声明只适用于特定的文件名模式?像这样的东西:

declare module "*.spec.ts" {
    // declarations here
}

你不能通过这样做来解决这个问题:

declare module "*.spec.ts" {
  /* ... */
}

因为这就是您描述所有 *.spec.ts 文件的 内容 的方式,而不是它们执行的环境。

最好将源代码与测试分开,并使用两个单独的 tsconfig.json 文件。如果您必须混合使用源代码和测试,唯一想到的选择是在包含文件的 外部 创建一个声明文件,然后在每个测试文件中手动导入它。例如,您可以在项目的根目录中创建一个名为 environment 的目录,并在其中放置一个 test.d.ts 文件。

./environment/test.d.ts

declare const foo: string;

现在,每个依赖全局 foo 的测试都需要引用 environment/test.d.ts

./path/to/foo.spec.ts

import '../environment/test';

console.log(foo);

这很麻烦,但我还没有找到更好的方法来为不同的文件提供不同的全局变量。通常,人们只是用他们可能拥有的所有全局变量(节点、浏览器、测试)污染了他们的全局命名空间。