TypeScript npm typings功能更改导入语义

时间:2016-01-06 00:15:03

标签: typescript

使用.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进行测试。

1 个答案:

答案 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模块并排放置,以及主模块输入的冗余描述。)