Импорт файла JS с TypeScript 2.0

javascript node.js typescript typescript2.0

23050 просмотра

2 ответа

9275 Репутация автора

Абстрактные

Я пытаюсь импортировать файл ".js" из внешнего местоположения (например, node_modules ). Я пытаюсь сделать это, используя шаблон модуля commonjs, однако импорт не захочет работать с типами файлов ".js", пока я не добавлю " .d.ts "файл рядом с" .js "файл в той же папке.

Но проблема в том, что я не хотел бы влиять на какие-либо node_modules с моими ".d.ts" файлами. Я хочу, чтобы он находился в другой папке, отдельно от node_modules, но как только я это сделаю, компилятор машинописного текста выдаст ошибку:

пример

У меня есть следующая структура папок:

|- DTS
|   |- y.d.ts
|- main.ts
|- y.js

y.js имеет следующее содержание

module.export = function (x) {
    console.log(x);
};

YDTS имеет следующее содержание

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команда выше, чтобы увидеть ошибку.

Автор: Lu4 Источник Размещён: 18.07.2016 08:05

Ответы (2)


0 плюса

157152 Репутация автора

возможность определять свои объявления ".d.ts", в то время как оба файла расположены в разных местах.

importСледует тот же процесс разрешения модуля, когда дан .jsили .d.tsфайл с относительными файлами.

Автор: basarat Размещён: 19.07.2016 01:52

17 плюса

1347 Репутация автора

Решение

Примечание. Официальная рекомендация для проверки ваших определений типов имеет несколько иной подход, чем тот, который представлен ниже. Я полагаю, что приведенный ниже подход немного лучше, поскольку файл * .d.ts практически идентичен конечному продукту.

Во время проверки типов (время сборки) TypeScript работает с файлами * .ts и (в основном) игнорирует файлы * .js . Позвольте мне привести пример, который мотивирует то, что (я считаю) вы предлагаете. Предположим, что существует очень хорошая библиотека JavaScript, которая, к сожалению, не имеет типов (например, 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" ]
  },
 ...
Автор: phreed Размещён: 30.08.2016 03:34
Вопросы из категории :
32x32