如何为名称中包含' @'?的模块提供TypeScript类型声明

时间:2018-04-21 21:50:48

标签: typescript

我试图通过为所有无类型依赖项提供类型声明(.d.ts)文件来使TypeScript编译器满意。但是,其中一些是流行软件包的自定义分支,或者像these这样的软件包,它们是较大项目的一部分并共享相同的@<project-name>命名空间。在这些情况下,其名称将包含@字符和斜杠,例如@absinthe/socket

在这种情况下,如何在.t.ds文件中声明我的类型化模块?对于上面的示例,我尝试了declare module '@absinthe/socket'declare module 'absinthe__socket'(由TypeScript编译器建议),但都没有效果。

2 个答案:

答案 0 :(得分:1)

原来我在我的定义文件中错误地导入了另一个模块,但在declare module @absinthe/socket范围之外。这导致TS编译器将文件视为实现,而不是声明文件。在模块声明中移动导入,如此

declare module '@absinthe/socket' { import { Socket as PhoenixSocket } from 'phoenix' … }

解决了我的问题。换句话说,语法@absinthe/socket.d.ts文件中声明自己的类型时工作正常。只有从DefinitelyTyped(或其他NPM源)获得这样的声明时,才需要使用双下划线语法(absinthe__socket)。

答案 1 :(得分:0)

Here's another question which describes how to install namespaced packages through @types.

  

不幸的是,npm不允许范围包在其名称中包含@,因此这些名称被修改为使用两个下划线代替@。

     

具体来说,如果你想为包@ foo / bar安装类型声明,你需要运行

npm install @types/foo__bar

如果他们无法使用您想要的套餐,make sure your .d.ts file is properly included under your tsconfig.json。例如如果您有"include": ["src/**/*"],请确保.d.ts文件位于src文件夹中。