6

所以让我们想象一下我有一个 50 个文件模块,每个模块包含:

export class <SomeClassName> { /* content */ }

然后,我创建了一个根文件,通过重新导出所有文件来简化使用。所以它看起来像:

export * from "./src/some-class-1";
export * from "./src/some-class-2";
export * from "./src/some-class-3";
// etc

然后,我通过 TSC 运行它来执行一个针对“es5”的“通用”模块,并带有描述符输出。

到目前为止,一切都很好。我将我package.json的名称my-module目标index.js作为模块的入口点输出。所以我现在决定在另一个打字稿项目中使用这个模块。

所以我为它进行了 npm 安装(让我们假装)npm install my-module并且它都被引入了,所以我现在有了生成的 d.ts 文件,并且我有了实际的 commonjs 模块,所以我可以使用它。一切似乎都很好。

然后问题来了。然后我决定使用该模块:

import {SomeClass1} from 'my-module'

它像在 TS 世界中一样爆炸,它不知道与什么my-module有关,好像我们回去看看输出的 index.js,它不包含环境模块。

所以问题来了,普通模块在包含模块名称时通常使用 package.json 作为参考点,但是 TS 使用 d.ts 文件。所以我想好吧,我需要将我的再导出包装index.ts在一个模块中,所以我尝试:

export module "my-module" { /* all other re-exports */ }

但事实证明,您只能对环境模块使用字符串模块名称,并且只能将它们放在 d.ts 文件中,但是我的 d.ts 文件是从现有代码库生成的。

所以这是我的困境,我可以手动进入并在declare module "my-module我的 d.ts 中添加一个包装器,但它不是很自动化,或者我确实喜欢使用 ES6 语法的博客文章并相对引用该文件,这最终会得到很多import {blah} from "../node_modules/my-module/dist/index",希望我们都能同意这有点愚蠢。

所以我找不到任何其他可以在自动化世界中工作的方法,因为当你使用 ES6 语法时,所有关于这个主题的博客文章和文档都使用相对文件导入,而不是从整个东西被编译和共享时导入通过 d.ts 文件。

那么这里有没有办法将我的重新导出包装在文本模块名称中?或者至少告诉 index.d.ts 包含在环境模块中?(请记住,它会为项目中的每个文件输出一个 d.ts 文件,但我们只关心通过 index.d.ts 导入模块,因为它会重新导出所有内容)。

4

3 回答 3

3

好的,我终于让它工作了,至少对 CommonJS 来说很好。

现在随着 typescript 1.6 的更改,TS 模块分辨率将检查node_modules文件夹中的index.d.ts文件。所以我基本上在构建过程结束时添加了这个文件,它指向我dist/definitions/index.d.ts的包含所有导出的文件。

这样,您就可以像这样进行导入import * from "my-module",并且只要在您的node_modules文件夹中有一个my-module带有 an的文件夹,index.d.ts它将基本上将该索引中的所有内容视为一个模块。

如果其他人得到一个更好的解决方案,它适用于所有人,而不仅仅是 commonjs,我会很乐意将答案更改为另一个,但目前它足以让我继续前进,希望它可以帮助其他人。

于 2015-10-08T16:29:49.143 回答
3

现在您仍然需要使用另一个工具来为您的包生成单个 .d.ts 文件。有一些工具可以做到这一点:

就我个人而言,我正在使用dts-generator 的定制版本,它使用 tsconfig.json 并与夜间 TypeScript 构建一起使用。你可以在这里看到它为我的一个包生成的 .d.ts 。

于 2015-08-15T11:35:11.010 回答
2

当你编译时index.ts,你需要告诉 TSC 为你生成定义文件。

索引.ts:

export * from "./src/some-class-1";
export * from "./src/some-class-2";
export * from "./src/some-class-3";

命令:

tsc --declaration index.ts

这应该d.ts为索引生成一个文件,其中包含导出以及d.ts每个导出的文件some-class-*

当然,用户需要参考所有d.ts文件才能使其工作,目前这是一个 PITA;看到这个。我相信您可以使用该--out选项将所有文件合并为一个,其中包括d.ts. 不过,我也不确定这是否是您想要的。

于 2015-08-14T01:00:30.720 回答