2017-02-22 32 views
11

Я не могу найти определение типа Type @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» разрешает нетипизированный модуль в '{проект путь} \ node_modules \ node-helper-lib \ index.js', который не может быть дополнен .

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

UPDATE:

Я использую:

  • Машинопись: 2.1.4
  • Visual Studio Код: 1.9.1
  • Node JS: 6.9.4
  • для Windows 10 x64

ответ

9

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

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

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

+0

Что я должен делать, если библиотека третьей стороной уже файл определения .d.ts включен, но я хотел бы, чтобы его игнорировать и использовать пользовательские один? –

+0

Я не уверен. Вы пытались указывать на пользовательское определение? – hirikarate

+16

Я пытаюсь написать файл определения для полностью нетипизированного модуля npm, 'supertest' - жалоба TypeScript даже не имеет смысла, как я могу не увеличивать то, что даже не имеет декларации? Я думал, что писал файлы пользовательского определения, подобные этому много раз ... '[ts] Недопустимое имя модуля в дополнении. Модуль «supertest» разрешает нетипизированный модуль в '/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js', который не может быть дополнен. '- к сожалению,' @ types/supertest' нарушается включением DOM библиотеки, которые его отломили .. похоже, что мне не повезло – ChaseMoskal

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