2017-09-14 31 views
0

我有一个旧的打字稿项目,它使用处理.d.ts文件的/typings/tsd.json方法,它还使用Typescript的module关键字将源代码编译为JavaScript的IIFE模块模式。 tsconfig.json中的模块设置(commonjs/amd/etc)被该关键字忽略。如何混合环境和非环境打字稿定义文件

对于演示,我加入​​到这个项目当中使用的importexport关键字比较典型的方法有SystemJS模块加载一些较新的打字稿代码,与.d.ts文件/ node_modules/@类型/。

一些咕嘟咕嘟/ SystemJS体操后,这一切都一起工作在运行时,我的轨道上打我的最后期限。但是我在编译时遇到了一个我想解决的情况。

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

编译器抱怨我的旧代码“已经或正在使用私有名'NewModel'”。

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

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

有什么我可以做的吗?

+0

我建议不要继续使用'tsd',迁移使用'@types'。你应该能够一次完成。 – unional

+0

您获取包的.d.ts文件根据您从何处获取而有所不同。如果我这样做了,那么所有的.d.ts文件都会导入/导出关键字,因此没有一个遗留代码可以编译。 –

+0

从'@ types'得到的新文件应该有相同的语法。原始库仍然是相同的CommonJS库(除非发生变化,那么您需要处理版本控制)。 'tsd'从DefinitelyTyped获取文件,与'@ types'相同。 TS团队做了合理的工作并转换格式。试试看看它是否有效。 – unional

回答

0

我目前的解决方案并不理想,但它适用于演示目的。

我下/分型/,创建一个新的文件夹,名为/特点4/和文件复制有关.d.ts到那里。编辑他们删除export关键字,根据需要去除import关键字修改和替换class关键字与interface防止修补遗留代码试图从一个原始new NewerModel()电话。

最后一点显然不起作用,因为较新的类实际上不存在于全局命名空间中,并且从classinterface的变化有助于阻止这种情况。由于我主要抓型号,接口不损失不是要求new NewerModel()写成<NewerModel>{}其他功能,但我仍然得到编译时检查的模式,这是什么,我想反正95%的性能。

我也有被同样的方式对待一些服务,但对他们的调用方法仍然工作,由于依赖注入。从未从全局名称空间调用服务。

该解决方案显然有一个问题,如果有人更改/newercode/feature4/models/NewerModels.ts,但是1)不应该有现在,截止日期之间的,和2),如果它是一个真正的问题我可以创建一个Gulp任务来自动复制和编辑每个版本上的文件.d.ts