Наличие ошибки "Имя модуля" разрешается для нетипизированного модуля в... "при написании файла определения 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;
}