Наличие ошибки "Имя модуля" разрешается для нетипизированного модуля в... "при написании файла определения TypeScript

Я не могу найти определение TypeScript @type/{name} для одного из моих установленных пакетов NodeJS, поэтому я пытаюсь записать для него файл 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 продолжает давать эту ошибку и помещает красную строку под declare module 'node-helper-lib':

[ts] Недопустимое имя модуля в дополнении. Модуль 'node -helper-lib' разрешает нетипизированный модуль в проекте {{ path}\ node_modules\node -helper-lib\index.js ', который не может быть дополненная.

Разве это не законно, потому что библиотека нетипизирована, поэтому мне должно быть разрешено добавлять к ней текст?

UPDATE:

Я использую:

  • TypeScript: 2.1.4
  • Код Visual Studio: 1.9.1
  • Node JS: 6.9.4
  • Windows 10 x64

Ответ 1

После некоторых попыток и ошибок я обнаружил, что augmentation означает "объявление модуля в том же файле с другими декларациями модуля".

Поэтому, если мы хотим записать файл определения для нетипизированной сторонней библиотеки JavaScript, у нас должен быть ТОЛЬКО ОДИН declare module 'lib-name' в этом файле, а 'lib-name' должен точно соответствовать библиотеке name (можно найти в свойстве 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 '...' { ... }

Я оставляю свое открытие здесь на всякий случай, если у кого-то есть такой же вопрос. И, пожалуйста, поправьте меня, если я что-то пропущу.

Ответ 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;
}