使用.d.ts
模式导入typings(import x = require('...')
)文件时,package.json的语义会发生变化
typings
使用条目。
例如,以下声明文件在没有时成功导入
使用package.json typings
条目,但它生成错误TS2656
(Exported external package typings file is not a module
)使用时
使用typings
条目:
declare module 'mymodule' {
export function myfunc(source: string): string;
}
而成功导入相同文件减去declare module {}
与package.json typings
条目一起使用时,但会生成错误
TS2307(Cannot find module
)在没有typings
条目的情况下使用。
export function myfunc(source: string): string;
为什么语义会发生变化?
如果您使用新的npm typings功能,您将不得不这样做 维护你的打字文件的npm和非npm版本。
我在尝试使用项目中的项目打字文件时遇到了这个
项目本身(TypeScript不会查看当前项目
package.json用于typings
个条目,它似乎限制了它的搜索范围
为./node_modules
)。
使用TypeScript 1.7.5进行测试。
答案 0 :(得分:3)
Per the documentation,package.json中的typings
键是main
键的模拟,指向单个Node.js模块。因此,d.ts
指向的typings
文件也应该是单个导出的模块声明,而不是d.ts包。
文件给出的具体理由是:
理由是打字不应该为编译文件集带来新的兼容源;否则,源文件(即
.ts
文件)将被编译器视为用户代码的一部分并将被编译,并且包中的输出可以被生成的.js
输出覆盖。此外,加载类型不应污染全局范围,方法是从同一个库的不同版本中引入可能存在冲突的条目。模块有自己的范围,并且不会污染全局命名空间,如果您的打包文件不是模块,它将污染用户全局范围,并将导致与依赖于您的包的其他包冲突。同样地,
/// <references ... />
可以将全局声明带入全局范围,应该避免使用。
(就个人而言,就像你一样,我认为这个实现是完全错误和愚蠢的。typings
密钥应该指向包含多个相对declare module './foo' { … }
声明描述的单个文件整个软件包,作为一种避免文件系统污染的方法,有大量特定于TypeScript的文件。不幸的是,那艘船已经航行了,所以你的软件包必须有大量特定于TypeScript的d.ts
文件与JavaScript模块并排放置,以及主模块输入的冗余描述。)