-1

我有一个编译和公开两个 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为这些模块启用并拥有正确的类型,所以我试图为每个模块编写声明文件。我已经尝试了 and 的多次迭代declare moduledeclare 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仍然作为 type 出现any

当我尝试为模块提供一个主体(即使只是一个空的)时,TypeScript 抱怨该模块没有默认导出。所以,我仍然需要一个解决方案来告诉 TypeScript 模块是一个包含该count属性的对象。

4

1 回答 1

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 的位置来解析的。

于 2019-01-09T04:06:55.043 回答