如何混合环境和非环境打字稿定义文件

How to mix ambient and non-ambient typescript definition files

我有一个较旧的 typescript 项目,它使用 /typings/tsd.json 方法处理 .d.ts 文件,并且还使用 Typescript 的 module 关键字来编译源代码进入 javascript 的 IIFE 模块模式。 tsconfig.json (commonjs/amd/etc.) 中的模块设置被该关键字忽略。

为了演示,我正在向该项目添加一些较新的打字稿代码,这些代码使用更典型的 importexport 关键字方法以及 SystemJS 模块加载器,使用 .d.ts /node_modules/@types/ 中的文件。

经过一些 Gulp/SystemJS 体操后,所有这些都在运行时协同工作,我有望在最后期限前完成。但是在我想解决的一种情况下,我在编译时遇到了麻烦。

当我修改旧代码以使用新代码中的 class(模型)时,我希望旧代码了解新代码的 .d.ts。所以我添加到旧代码文件的顶部 /// <reference path="../../newercode/feature4/models/NewerModels.d.ts"/>。 (或者,我在 tsd.d.ts 中输入了相同的行,但我得到了相同的结果。)

编译器抱怨我的旧代码 "has or is using private name 'NewModel'"。

在 NewerModels.d.ts 中,importexport 关键字仍然存在,而 .d.ts 文件中的 none 已经在 /typings/ 中使用这些关键字。这些关键字是虚假编译器错误的罪魁祸首。

遗留项目需要环境 .d.ts 文件,较新的代码生成非环境。

我能做些什么吗?

我当前的解决方案并不理想,但可以用于演示目的。

我在/typings/下创建了一个新文件夹,名为/feature4/,并复制了相关的。 d.ts 文件到那里。编辑它们以删除 export 关键字,根据需要进行修改以删除 import 关键字,并将 class 关键字替换为 interface 以防止修补后的遗留代码尝试原始 new NewerModel() 呼叫。

最后一点显然行不通,因为较新的 类 实际上并不存在于全局命名空间中,而从 classinterface 的更改有助于阻止这种情况。由于我主要是抓取模型,接口除了要求 new NewerModel() 写成 <NewerModel>{} 外没有失去任何功能,但我仍然可以在编译时检查模型的属性,这是 95%反正我想要什么。

我也有一些以相同方式处理的服务,但由于依赖注入,调用它们的方法仍然有效。这些服务从来没有从全局名称空间开始调用。

如果有人更改 /newercode/feature4/models/NewerModels.ts,这个解决方案显然会有问题,但是 1) 从现在到截止日期之间应该没有任何问题,并且 2 ) 如果这真的是一个问题,我可以创建一个 Gulp 任务来自动复制和编辑每个构建中的 .d.ts 文件。