仅将 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 - 仅将特定子文件夹复制为捆绑资源