Декларация для модуля экспорта объекта
У меня есть проект, который компилирует и выставляет два модуля CommonJS; каждый из них объект. Затем у меня есть другой проект, который потребляет их.
Структуры проекта следующие:
multi-mod-package
|-mod1
| |-index.js
|-mod2
| |-index.js
|-package.json
multi-mod-consumer
|-index.ts
|-package.json
|-tsconfig.json
И содержимое файла:
мульти-мод-пакет /mod1/index.js
module.exports.default = {
"count": "One"
};
мульти-мод-пакет /mod2/index.js
module.exports.default = {
"count": "Two"
};
мульти-мод-потребительские /index.ts
import one from "multi-mod-package/mod1";
import two from "multi-mod-package/mod2";
console.log(`${one.count}, ${two.count}, Buckle My Shoes`);
мульти-мод-потребитель /tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"noImplicitAny": true
},
"include": [
"index.ts"
]
}
Без noImplicitAny
, это работает нормально. Проект компилируется, и One, Two, Buckle My Shoes
выводится, как и ожидалось. Тем не менее, модули не имеют типирования. Я хотел бы включить noImplicitAny
и у меня есть правильные типы для этих модулей, поэтому я пытаюсь написать файлы объявлений для каждого из них. Я попробовал несколько итераций declare module
а также declare namespace
, но я продолжаю получать ошибки "... не модуль" при попытке использовать модули.
Как мне написать файл декларации для модуля, который экспортирует объект?
ОБНОВИТЬ
Добавление двух файлов определений - multi-mod-package/mod1/index.d.ts
а также multi-mod-package/mod1/index.d.ts
- с содержанием declare module "multi-mod-package/mod1";
а также declare module "multi-mod-package/mod1";
- соответственно - избавляется от ошибок "... это не модуль". Тем не менее, до сих пор нет надлежащих печатных машин; one.count
все еще подходит как тип any
,
Когда я пытаюсь дать модулю тело (даже пустое), TypeScript жалуется, что у модуля нет экспорта по умолчанию. Итак, мне все еще нужно решение, чтобы сказать TypeScript, что модуль является объектом, содержащим count
имущество.
1 ответ
Вам необходимо объявить субмодуль как отдельные модули.
В ваших печатях (например, typings/multi-mod-package.d.ts
):
declare module 'multi-mod-package/mod1' {
// typings for mod1
}
declare module 'multi-mod-package/mod2' {
// typings for mod2
}
Для того, чтобы написать ваши печатные издания, вы можете проверить руководство:
https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html
TypeScript не выполняет автоматическое глубокое связывание, поскольку разрешение узла для глубокого связывания может отличаться от структуры типирования.
Глубокая ссылка на узел разрешается в зависимости от расположения файла package.json.