Импорт js файла с TypeScript 2.0
Аннотация
Я пытаюсь импортировать файл .js из внешнего местоположения (т.е. node_modules). Я пытаюсь сделать это с помощью шаблона модуля commonjs, однако import не захочет работать с файлами типа .js, пока я не добавлю файл ".d.ts" рядом с файлом ".js" в той же папке.
Но проблема в том, что я не хочу влиять на node_modules с моими файлами .d.ts. Я хочу, чтобы он находился в другой папке, отдельно от node_modules, но как только я это сделаю, компилятор typescript выдает ошибку:
Пример
У меня есть следующая структура папок:
|- DTS
| |- y.d.ts
|- main.ts
|- y.js
y.js имеет следующий контент
module.export = function (x) {
console.log(x);
};
y.d.ts имеет следующий контент
export interface Y {
(x): any;
}
declare let y: Y;
export default y;
main.ts имеет следующий контент
import * as y from './y'
Теперь, когда я пытаюсь скомпилировать main.ts с помощью
tsc -m commonjs -t ES2015 main.ts
Я получаю сообщение об ошибке:
x.ts(1,20): error TS2307: Cannot find module './y'.
Вопрос
Как импортировать файлы ".js" и быть в состоянии определить его ".d.ts" объявления, имея оба файла, расположенные в разных местах.
Изменить
Вот ссылка на пример проекта. Обязательно используйте компилятор typescript версии 2.0. И команду tsc
выше, чтобы увидеть ошибку.
Ответы
Ответ 1
Примечание. Официальная рекомендация N3).
Который был установлен через npm, таким образом:
npm install n3 --save
Это, как обычно, добавляется к ./node_modules/n3/... и project.json.
Как уже упоминалось, типизация не существует и ее необходимо добавить вручную.
Для этой цели я создаю файл ./@types/n3.d.ts.
Для наших целей не особо важно то, что на самом деле есть определения, но что-то вроде следующего - хороший старт:
declare namespace N3 {
}
declare module "n3" {
export = N3;
}
Теперь на ваш вопрос.
Обновите ' tsconfig.json':
...
"compilerOptions": {
"typeRoots": [
"node_modules/@types",
"@types"
],
...
"paths": {
"*": [
...
"./@types/*"
]
По-прежнему необходимо иметь дело с разрешением во время выполнения для поиска соответствующих файлов *.js, но это другой вопрос, чем тот, который вы задали.
Для справки вы можете найти Что нового в TypeScript
и этот дискуссионный поток полезен.
Этот подход отлично работает при работе с глобальными переменными, но не с модулями.
Обновите ' tsconfig.json':
...
"paths": {
"*": [
...
"./@types/*"
],
"foo": [ "./@types/foo.d.ts" ]
},
...
Ответ 2
может определить его объявления ".d.ts", имея оба файла, расположенные в разных местах.
import
следует тому же процессу разрешения модуля при задании файла .js
или .d.ts
с относительными файлами.