设置
假设我们有两个文件,A.ts和B.d.ts。现在在A中我们有:
class A implements B{...}
现在假设我想将所有的typescript文件组合成一个单一的定义文件。我知道如何做到这一点的唯一方法是创建一个.js文件,然后创建一个生成的.d.ts文件。
因此我们这样做:
tsc --out foo.js --declaration B.d.ts A.ts
我们得到了foo.js和foo.d.ts.
现在唯一的问题是,foo.d.ts只包含A.ts的定义,而不包含B.d.ts的定义。因此,为了让我们生成的foo.d.t真正工作,而不抛出错误,我们需要添加对B.d.t的手动引用,或者我们需要将B.d.ts中的全部内容复制并粘贴到foo.d.ts
这两种解决方案都相当丑陋。那么,有没有一种方法可以通过typescript编译器创建一个奇异的声明文件,其中还将包括用户创建的接口?我一定是错过了什么。。。
这种行为是经过设计的,旨在使编写库扩展和管理依赖关系变得更容易。例如,如果您正在编写jQuery插件,则希望.d.ts
文件包含所有定义,但不包含jQuery定义。因此,编译器不会将"外部".d.ts
文件中的任何内容添加到您生成的组合.d.ts
文件中。
如果它包含这些定义,当人们组合多个库时,就会导致重复的定义错误(即jQuery定义在每个插件定义中都会重复(。
如果您希望代码包含在单个编译的.d.ts
文件中,则它需要源自不带d前缀的.ts
文件。这确实意味着要将declare
关键字添加到文件中的模块/类中,但实际上,这可能会成为0.9版本的要求,即使是.d.ts
文件,这样也不会有太多开销。
本质上,您可以将文件扩展名想象如下:
.ts
文件是程序内部文件.d.ts
文件是外部依赖项
使用B.ts
而不是B.d.ts
您可以在此处看到示例:https://github.com/basarat/ts-test/tree/master/tests/compileToSingle
我的输出.d.tshttps://github.com/basarat/ts-test/blob/master/tests/compileToSingle/out.d.ts包含dec.ts中的接口:https://github.com/basarat/ts-test/blob/master/tests/compileToSingle/dec.ts
我的out.d.ts不包含接口:https://github.com/basarat/ts-test/blob/34eeb54618e57765ea0e2f9ce0c48ebd7f46942a/tests/compileToSingle/out.d.ts如果我有一个dec.d.ts:https://github.com/basarat/ts-test/blob/34eeb54618e57765ea0e2f9ce0c48ebd7f46942a/tests/compileToSingle/dec.d.ts
您可以在.ts
中为类/变量等使用declare关键字。不要为接口使用declard,因为它在TS>0.9