Having error "Module 'name' resolves to an untyped module at..." when writing custom TypeScript definition file

33,433

Solution 1

After some tries and errors, I found that augmentation means "declaring a module in the same file with other module declaration(s)".

Therefore if we want to write a definition file for an untyped 3rd-party JavaScript library, we must have ONLY ONE declare module 'lib-name' in that file, and 'lib-name' must exactly match the library name (can be found in its package.json, "name" property).

On the other hand, if a 3rd-party library already has definition file .d.ts included, and we want to extend its functionalities, then we can put the additional definition in another file that we create. This is called augmenting.

For example:

// 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 '...' { ... }

I leave my discovery here just in case somebody has same question. And please correct me if I missed something.

Solution 2

The actual solution is given in a comment by @Paleo in @hirikarate's answer:

Imports should be declared inside the module declaration.

Example:

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

Solution 3

I was getting that error message too. The issue for me was that I was trying to declare another module in an existing type definition file that had a module declaration in it. After I moved the new module declaration to a new file, the error went away.

Solution 4

The issue for me was that I was trying to declare the module in a .ts file. I changed it to .d.ts and it all worked just fine.

Share:
33,433

Related videos on Youtube

hirikarate
Author by

hirikarate

Updated on July 08, 2022

Comments

  • hirikarate
    hirikarate almost 2 years

    I can't find TypeScript definition @type/{name} for one of my installed NodeJS packages, so I attempt to write a d.ts file for it, and put the file in {project root}\typings folder. This is how I do:

    // 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;
    }
    

    However, Visual Studio Code keeps yielding this error and puts red line under declare module 'node-helper-lib':

    [ts] Invalid module name in augmentation. Module 'node-helper-lib' resolves to an untyped module at '{project path}\node_modules\node-helper-lib\index.js', which cannot be augmented.

    Isn't it legit that because the library is untyped, so I should be allowed to add typing to it?

    UPDATE:

    I am using:

    • TypeScript: 2.1.4
    • Visual Studio Code: 1.9.1
    • Node JS: 6.9.4
    • Windows 10 x64
  • Alen Liang
    Alen Liang over 7 years
    What should I do if a 3rd-party library already has definition file .d.ts included, but I would like to ignore it and use a custom one?
  • hirikarate
    hirikarate over 7 years
    I'm not sure. Did you try <reference path=".." /> pointing to custom definition?
  • ChaseMoskal
    ChaseMoskal about 7 years
    I'm trying to write a definition file for a completely untyped npm module, supertest — TypeScript's complaint doesn't even make sense, how can I not augment something that doesn't even have a declaration? I thought I've wrote custom definition files like this many times... [ts] Invalid module name in augmentation. Module 'supertest' resolves to an untyped module at '/home/chase/Desktop/projects/formuoli/node_modules/supertes‌​t/index.js', which cannot be augmented. — unfortunately @types/supertest is broken by including DOM libraries rendering it broken.. looks like I'm out of luck
  • Paleo
    Paleo almost 7 years
    @ChaseMoskal: In your file .d.ts, maybe you should just move all the import into the declare module "moduleName" {}.
  • pocesar
    pocesar almost 7 years
    @Paleo that was exactly it, all import calls must go inside declare module 'module' {} scope. the error is misleading at best
  • binki
    binki about 6 years
    typescript does the same thing if you put the import statements required by your module outside of the declare module instead of inside it. Such unintuitive odd behavior (sorry for ranting here).
  • Douglas Gaskell
    Douglas Gaskell over 3 years
    This is a catch-22. Can't import the somemodulehere because it doesn't have a declaration. Can't create a declaration to augment it because it's an untyped modue. The example above would be throwing 2 errors. The first being that you cannot augment the node-helper-lib the 2nd being that it cannot find the declaration file for the import.
  • Lee Benson
    Lee Benson over 3 years
    It may have changed since I wrote that.
  • giovannipds
    giovannipds almost 2 years