2017-02-22 105 views
11

我找不到TypeScript定义@type/{name},因此我尝试编写一个d.ts文件为它,并将文件放在{project root}\typings文件夹中。这是我该怎么办:在编写自定义TypeScript定义文件时发生错误“模块名'在...下解析为无类型模块

// My source code: index.ts 
import Helper from 'node-helper-lib'; 


// My definition: \typings\node-helper-lib.d.ts 
declare....(something else) 

declare module 'node-helper-lib' { 
    class Helper { ... } 
    export = Helper; 
} 

但是,Visual Studio代码保持产生这个错误,并把红线declare module 'node-helper-lib'下:在隆乳术

[TS]无效的模块名称。模块'node-helper-lib' 解决了'{project path} \ node_modules \ node-helper-lib \ index.js'中的无类型模块,它不能被 增强。

这是不是合法的,因为图书馆是无类型的,所以我应该被允许添加打字?

UPDATE:

我使用:

  • 打字稿:2.1.4
  • Visual Studio代码:1.9.1
  • 节点JS:6.9.4
  • 的Windows 10 x64

回答

9

经过一些尝试和错误之后,我发现augmentation的意思是“用其他模块声明在同一个文件中声明一个模块”。

因此,如果我们要写定义文件的无类型第三方JavaScript库,我们必须只有一个declare module 'lib-name'在该文件中,和“LIB-名”必须与库名精确匹配(可以发现它的package.json,“name”属性)。

在另一方面,如果第三方库已经有包括定义文件.d.ts,我们想扩展它的功能,那么我们就可以把更多的定义,我们创建另一个文件。这叫做augmenting

例如:

// These module declarations are in same file, given that each of them already has their own definition file. 
declare module 'events' { 
    // Extended functionality 
} 

declare module 'querystring' { 
    // Extended functionality   
} 

declare module '...' { ... } 

我离开这里我发现,以防万一有人有同样的问题。如果我错过了什么,请纠正我。

+0

我应该怎么做,如果第三方库已经有了定义文件.d.ts包括在内,但我想忽略它,使用自定义的呢? –

+0

我不确定。您是否尝试过指向自定义定义? – hirikarate

+16

我试图写一个完全无类型的npm模块的定义文件,'supertest' - TypeScript的投诉甚至没有意义,我怎么能不增加甚至没有声明的东西?我以为我已经多次编写自定义定义文件......'[ts]增强中的模块名称无效。模块'supertest'在'/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js'中解析为无类型模块,不能扩充。' - 不幸的是'@ types/supertest'被包含DOM库渲染它破坏..看起来像我运气不好 – ChaseMoskal

2

实际的解决方案是通过@Paleo评论给出@ hirikarate的回答是:

进口应被宣布的模块声明。

例子:

declare module 'node-helper-lib' { 
    import * as SomeThirdParty from 'node-helper-lib'; 
    interface Helper { 
     new(opt: SomeThirdParty.Options): SomeThirdParty.Type 
    } 
    export = Helper; 
}