【问题标题】:Having error "Module 'name' resolves to an untyped module at..." when writing custom TypeScript definition file编写自定义 TypeScript 定义文件时出现错误“模块'名称'解析为...的无类型模块”
【发布时间】:2017-07-12 07:25:15
【问题描述】:

我找不到我安装的其中一个 NodeJS 包的 TypeScript 定义 @type/{name},所以我尝试为其编写一个 d.ts 文件,并将该文件放在 {project root}\typings 文件夹中。我就是这样做的:

// 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 Code 不断产生此错误,并在declare module 'node-helper-lib' 下放置红线:

[ts] 扩充中的模块名称无效。模块'node-helper-lib' 解析为 '{project 的无类型模块 path}\node_modules\node-helper-lib\index.js',不能是 增强。

因为库是无类型的,所以我应该被允许添加类型,这不是合法的吗?

更新:

我正在使用:

  • TypeScript:2.1.4
  • Visual Studio 代码:1.9.1
  • 节点 JS:6.9.4
  • Windows 10 x64

【问题讨论】:

    标签: node.js typescript typescript-typings typescript2.1


    【解决方案1】:

    @Paleo 在@hirikarate 的回答中的评论中给出了实际的解决方案:

    应在模块声明声明导入。

    例子:

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

    【讨论】:

    • 这是第 22 条规则。无法导入 somemodulehere,因为它没有声明。无法创建声明来扩充它,因为它是 untyped modue。上面的示例将引发 2 个错误。第一个是您无法增加node-helper-lib,第二个是它找不到导入的声明文件。
    • 自从我写了之后,它可能已经改变了。
    【解决方案2】:

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

    因此,如果我们要为 无类型 3rd-party JavaScript 库编写定义文件,我们必须在该文件中只有一个 declare module 'lib-name',并且“lib-name”必须与库名(可以在它的 package.json, "name" 属性中找到)。

    另一方面,如果第 3 方库已经包含定义文件 .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 '...' { ... }
    

    我把我的发现留在这里,以防有人有同样的问题。如果我遗漏了什么,请纠正我。

    【讨论】:

    • 如果第三方库已经包含定义文件.d.ts,但我想忽略它并使用自定义文件,我该怎么办?
    • 我正在尝试为完全无类型的 npm 模块编写定义文件,supertest — TypeScript 的抱怨甚至没有意义,我怎么能不增加一些甚至没有宣言?我以为我已经写过很多次这样的自定义定义文件了...[ts] Invalid module name in augmentation. Module 'supertest' resolves to an untyped module at '/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js', which cannot be augmented. — 不幸的是,@types/supertest 因包含 DOM 库而被破坏了。看起来我不走运
    • @ChaseMoskal:在您的文件 .d.ts 中,也许您应该将所有导入移至声明模块“moduleName”{}。
    • @Paleo 就是这样,所有import 调用都必须在declare module 'module' {} 范围内。该错误充其量是误导
    • typescript 如果您将模块所需的 import 语句放在 declare module 之外而不是在其中,那么 typescript 会执行相同的操作。这种不直观的奇怪行为(抱歉在这里咆哮)。
    【解决方案3】:

    我也收到了该错误消息。对我来说,问题是我试图在现有类型定义文件中声明另一个模块,其中包含模块声明。在我将新模块声明移至新文件后,错误消失了。

    【讨论】:

      【解决方案4】:

      对我来说,问题是我试图在 .ts 文件中声明模块。我将其更改为.d.ts,一切正常。

      【讨论】:

        猜你喜欢
        • 2017-02-10
        • 2019-01-29
        • 2020-06-27
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 2017-07-30
        • 1970-01-01
        相关资源
        最近更新 更多