“tsc --outout ... --declaration”不包括自定义界面

时间:2013-05-22 08:46:34

标签: typescript tsc

设置
让我们说我们有两个文件,A.ts和B.d.ts.现在在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的定义而不包含B.d.ts的定义。因此,要使我们生成的foo.d.ts实际工作而不是抛出错误,我们需要添加一个手动引用Bdts或者我们需要将Bdts的全部内容复制并粘贴到foo.d.ts。

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

2 个答案:

答案 0 :(得分:6)

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

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

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

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

  • .ts文件是程序的内部文件
  • .d.ts文件是外部依赖项

答案 1 :(得分: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.ts https://github.com/basarat/ts-test/blob/34eeb54618e57765ea0e2f9ce0c48ebd7f46942a/tests/compileToSingle/dec.d.ts

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