Декларация для модуля экспорта объекта

У меня есть проект, который компилирует и выставляет два модуля 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.

Другие вопросы по тегам