4

设置
假设我们有两个文件,A.ts 和 Bdts。现在在 A 里面我们有:

class A implements B{...}

现在假设我想将我所有的打字稿文件组合成一个单一的定义文件。我知道如何做到这一点的唯一方法是创建一个 .js 文件,然后创建一个 .d.ts 文件。

因此我们这样做:

tsc --out foo.js --declaration B.d.ts A.ts

我们得到 foo.js 和 foo.d.ts。

现在唯一的问题是 foo.d.ts 只包含 A.ts 而不是 Bdts 的定义。因此,为了让我们生成的 foo.d.ts 真正工作并且不抛出错误,我们需要手动添加对 Bdts 的引用,或者我们需要将 Bdts 的全部内容复制并粘贴到 foo.d.ts 中。

这两种解决方案都相当难看。那么有没有办法通过 typescript 编译器创建一个单一的声明文件,该文件还包括用户创建的接口?我肯定错过了什么...

4

2 回答 2

6

该行为是设计使然,旨在使编写库扩展和管理依赖关系更容易一些。例如,如果您正在编写一个 jQuery 插件,您会希望您的.d.ts文件包含所有定义,但不包含 jQuery 定义。因此,编译器不会将“外部”文件中的任何内容添加到您生成.d.ts的组合文件中。.d.ts

如果它确实包含这些定义,那么当人们组合多个库时会导致重复定义错误(即,jQuery 定义将在每个插件定义中重复)。

如果您希望代码包含在您的单个编译.d.ts文件中,它需要源自.ts没有 d 前缀的文件。这确实意味着将declare关键字添加到文件内的模块/类中 - 但实际上这可能成为 0.9 版中的要求,即使对于.d.ts文件也是如此,因此开销并不大。

本质上,您可以将文件扩展名视为如下:

  • .ts文件在程序内部
  • .d.ts文件是外部依赖项
于 2013-05-22T09:24:51.653 回答
2

使用B.ts代替B.d.ts

您可以在此处查看示例:https ://github.com/basarat/ts-test/tree/master/tests/compileToSingle

我的out.d.ts https://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.tshttps ://github.com/basarat/ts-test/blob/34eeb54618e57765ea0e2f9ce0c48ebd7f46942a/tests/compileToSingle/dec.d.ts

您可以对您的类/变量等使用 declare 关键字,.ts不要对接口使用声明,因为这会在 TS > 0.9 中中断

于 2013-05-22T09:14:44.707 回答