我试图通过为所有无类型依赖项提供类型声明(.d.ts
)文件来使TypeScript编译器满意。但是,其中一些是流行软件包的自定义分支,或者像these这样的软件包,它们是较大项目的一部分并共享相同的@<project-name>
命名空间。在这些情况下,其名称将包含@
字符和斜杠,例如@absinthe/socket
。
在这种情况下,如何在.t.ds
文件中声明我的类型化模块?对于上面的示例,我尝试了declare module '@absinthe/socket'
和declare module 'absinthe__socket'
(由TypeScript编译器建议),但都没有效果。
答案 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
文件夹中。