Согласование объявления модуля определения typescript с импортированием модуля node
Я установил популярную библиотеку d3
через NPM
.
npm install d3
tsd install d3 -save
tsc
В моем файле home.ts
я импортировал модуль:
import * as d3 from 'd3/d3';
Скомпилируется правильно, но я получаю эту семантическую ошибку:
app/home/components/home.ts(2,21): error TS2307: Cannot find module 'd3/d3'.
Кроме того, я теряю всю свою подсветку синтаксиса/информацию о начале ввода в моей среде IDE.
Оригинальный d3.d.ts
файл, предоставленный TSD
, объявляет модуль следующим образом:
declare module 'd3' {
export = d3;
}
Если я изменю модуль на 'd3/d3'
, все будет нормально:
declare module 'd3/d3' {
export = d3;
}
Итак, мне сложно найти и то, что мне нужно:
import * as d3 from 'd3';
дает мне определения типов, которые я ожидаю, но ищет модуль в node_modules/d3.js
, который является неправильным.
import * as d3 from 'd3/d3';
находит правильный модуль, потому что путь прав, но я теряю определения типа, потому что объявление модуля не соответствует.
Как я могу совместить эти две вещи, чтобы я мог просто импортировать модуль, не теряя определения типов?
FYI: Я использую typescript 1.7.5, а мой moduleResolution
установлен на node
.
Вам нужно сказать загрузчику, где искать вещи. В systemjs.config.js
добавьте следующее отображение в объект map
:
var map= {
...
...
'd3': 'node_modules/d3'
};
Файл d3.js
действительно находится в node_modules/d3
, и указанное выше отображение позволит загрузчику найти файл. Теперь вы можете импортировать его в свои компоненты как:
import * as d3 from 'd3';