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

Posted

技术标签:

【中文标题】仅将 TypeScript 环境声明添加到特定文件(如 *.spec.ts)【英文标题】:Adding TypeScript ambient declarations only to specific files (like *.spec.ts) 【发布时间】:2019-07-11 13:55:15 【问题描述】:

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

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

【问题讨论】:

难道你不能还有两个 tsconfig 并在其中使用 include exclude 来获取包含/排除的适当文件吗?typescriptlang.org/docs/handbook/tsconfig-json.html 【参考方案1】:

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

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);

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

【讨论】:

以上是关于仅将 TypeScript 环境声明添加到特定文件(如 *.spec.ts)的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionViewLayout:仅将装饰视图添加到特定单元格

Xcode iOS Build - 仅将特定子文件夹复制为捆绑资源

TypeScript 声明特定的 SCSS 模块

如何使用 Maven pom 仅将 jar 文件下载到特定目录?

如何使用 rsyslog 仅将特定文件发送到远程服务器

TypeScript 中是不是有一种编译时方法来声明一个 keyof 类型,只有映射到特定类型的键? [复制]