Я пытаюсь понять, как правильно работать с модулями типа TSI и классическим JS.ТипScript не может найти модуль, если он содержит требуемый
Я создал очень простой проект, со следующей архитектурой файла:
.
├── index.ts
├── lodash.d.ts
├── module.ts
└── node_modules
└── lodash
lodash
был установлен с npm
. Поскольку, как представляется, нет никакой информации о типизациях, я написал базовый файл d.ts
, который описывает только одну функцию, только для того, чтобы угодить tsc
и избежать ошибки об отсутствии значения lodash
.
lodash.d.ts
declare module "lodash" {
export function reverse(array: any[]): any[];
}
В моем module.ts
файл, импортировать lodash с require
и выставить функцию на модуле, который я использую на index.ts
файл.
module.ts
/// <reference path="./lodash.d.ts" />
import _ = require('lodash');
module FooModule {
export function foo() {
return _.reverse([1, 2, 3]);
}
}
index.ts
/// <reference path="./module.ts" />
let a = FooModule.foo();
console.log(a);
Проблема заключается в том, что tsc
(и так VS Code) говорит мне, что он не может найти имя FooModule
.
$ tsc index.ts --module commonjs -outDir build
index.ts(3,9): error TS2304: Cannot find name 'FooModule'.
Однако, если я удалить import _ = require('lodash');
из module.ts
, он работает правильно (за исключением очевидного факта, что _
переменная теперь не определено).
Я делаю что-то не так с этим require
?
Получаю, спасибо за четкое объяснение.Но если экспортировать 'FooModule', как вы предложили в конце вашего ответа, это плохая практика, какой чистый способ сделать это? Или, если это более архитектурная проблема, как мне сделать, чтобы потреблять узловые модули по частям кода, который я хочу открыть в моем проекте? – Blackus
@Blackus Просто удалите часть модуля FooModule и оставьте свои функции открытыми. Они будут частью модуля 'module' (или независимо от имени вашего файла без расширения' .ts'). Кроме того, не забывайте, что вам понадобится система загрузки модуля во время выполнения (у Node.js есть встроенный). –
Я, наконец, понял это, он просто работает как модули CommonJS (в данном случае). Что на самом деле обмануло меня в первую очередь, это мой способ построения (я использую веб-пакет с моим реальным проектом), что было неправильно, и все мои файлы были неправильно перестроены. Теперь все ясно. Еще раз спасибо :) – Blackus