Помилка „Ім’я модуля“ перетворюється на нетипізований модуль о… ”під час написання власного файлу визначення TypeScript


89

Я не можу знайти визначення 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 Code продовжує видавати цю помилку і ставить червоний рядок під declare module 'node-helper-lib':

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

Чи не правомірно, що оскільки бібліотека нетипізована, то мені слід дозволити додавати до неї набір тексту?

ОНОВЛЕННЯ:

Я використовую:

  • TypeScript: 2.1.4
  • Код Visual Studio: 1.9.1
  • Вузол JS: 6.9.4
  • Windows 10 x64

Відповіді:


151

Фактичне рішення наведено у коментарі @Paleo у відповіді @ hirikarate:

Імпорт повинен бути оголошений всередині декларації модуля.

Приклад:

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

21
Це десь задокументовано?
Кріс

12
Не знаю, скільки годин мені знадобилося, щоб нарешті це знайти. Дуже дякую! Це, безумовно, слід краще задокументувати ...
Джонатан Грубер

Чому TypeScript не має хорошого повідомлення про помилку або чогось подібного?
VitorLuizC

53

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

Тому, якщо ми хочемо написати файл визначення для нетипізованої сторонньої бібліотеки JavaScript, declare module 'lib-name'у цьому файлі повинен бути ТІЛЬКИ ОДИН , а 'lib-name' має точно відповідати імені бібліотеки (можна знайти в її package.json, " назва "властивість".

З іншого боку, якщо в сторонній бібліотеці вже є файл визначення .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 '...' { ... }

Я залишаю своє відкриття тут лише на той випадок, якщо хтось має таке саме запитання. І, будь ласка, виправте мене, якщо я щось пропустив.


1
Що робити, якщо у сторонній бібліотеці вже є файл визначення .d.ts, але я хотів би проігнорувати його та скористатися власним?
Alen Liang

24
Я намагаюся написати файл визначення для абсолютно нетипізованого модуля 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

34
@ChaseMoskal: У вашому файлі .d.ts, можливо, вам слід просто перемістити весь імпорт у модуль оголошення "moduleName" {}.
Палео,

17
@Paleo, що це було саме цим, усі importдзвінки повинні входити всередину declare module 'module' {}. помилка в кращому випадку вводить в оману
pocesar

2
typecript робить те саме, якщо ви розміщуєте importоператори, які вимагає ваш модуль, поза, declare moduleа не всередині нього. Така неінтуїтивна дивна поведінка (вибачте за скандальність тут).
binki

0

Я теж отримував це повідомлення про помилку. Проблема для мене полягала в тому, що я намагався оголосити інший модуль у існуючому файлі визначення типу, який містив декларацію модуля. Після того, як я перемістив нову декларацію модуля до нового файлу, помилка зникла.


-4

У моєму випадку я просто використав наступну декларацію в одному з моїх файлів типів, тому я зміг використати всі пакунки, не пов'язані з TypeScript:

declare module '*'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.