Импорт 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 с относительными файлами.