我有一个编译并公开两个CommonJS模块的项目;他们每个人一个对象。然后,我有另一个消耗它们的项目。
项目结构如下:
multi-mod-package
|-mod1
| |-index.js
|-mod2
| |-index.js
|-package.json
multi-mod-consumer
|-index.ts
|-package.json
|-tsconfig.json
文件内容:
multi-mod-package / mod1 / index.js
module.exports.default = {
"count": "One"
};
multi-mod-package / mod2 / index.js
module.exports.default = {
"count": "Two"
};
multi-mod-consumer / 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`);
multi-mod-consumer / 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
属性的对象的解决方案。
答案 0 :(得分: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的位置解决的。