我试图通过为所有非类型化依赖项提供类型声明(.d.ts
)文件来使TypeScript编译器满意。然而,其中一些是流行包的自定义分支,或者像these这样的包,它们是更大项目的一部分,并共享相同的@<project-name>
命名空间。在这些情况下,它们的名称将包含@
字符和斜杠,例如@absinthe/socket
。
在这种情况下,我如何在.t.ds
文件中声明我的类型化模块?对于上面的示例,我尝试了declare module '@absinthe/socket'
和declare module 'absinthe__socket'
(根据TypeScript编译器的建议),但都不起作用。
发布于 2018-04-23 08:19:06
事实证明,我在定义文件中错误地导入了另一个模块,但超出了declare module @absinthe/socket
作用域。这导致TS编译器将该文件视为实现,而不是声明文件。在模块声明中移动导入,如下所示
declare module '@absinthe/socket' { import { Socket as PhoenixSocket } from 'phoenix' … }
解决了我的问题。因此,换句话说,在.d.ts
文件中声明自己的类型时,语法@absinthe/socket
工作得很好。只有在从DefinitelyTyped (或其他NPM源)获得这样的声明时,才需要使用双下划线语法(absinthe__socket
)。
发布于 2018-04-22 02:56:04
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
文件夹中。
https://stackoverflow.com/questions/49960512
复制