假设我有一个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运行它来做一个&#34;普通&#34;模块定位&#34; es5&#34;带描述符输出。
到目前为止一切顺利。我将名为package.json
的{{1}}定位为输出的my-module
作为我的模块的入口点。所以我现在决定在另一个打字稿项目中使用这个模块。
所以我为它做了npm安装(让我们假装)index.js
并且它全部拉入,所以我现在有生成的d.ts文件,我有实际的commonjs模块所以我可以使用这一切。一切似乎都很好。
然后出现了问题。然后我决定使用该模块:
npm install my-module
它在TS世界中爆炸,它不知道import {SomeClass1} from 'my-module'
与...有什么关系,好像我们回去查看输出的index.js,它不包含环境模块。
所以这就是问题,常见模块在包含模块名称时通常使用package.json作为参考点,但TS使用d.ts文件。所以我认为好,我需要在my-module
中将我的再出口包装在一个模块中,所以我尝试:
index.ts
但事实证明你只能为环境模块使用字符串模块名称,并且你只能将它们放在d.ts文件中,但我的d.ts文件是从现有的代码库生成的。
所以这就是我的困境,我可以手动进入并向我的d.ts添加export module "my-module" { /* all other re-exports */ }
包装,但它不是非常自动化,或者我喜欢使用ES6语法的博客文章并引用相对的文件,最终会有很多declare module "my-module
,希望我们都同意这有点傻。
所以我找不到任何可以在自动化世界中运行的其他方法,因为当你使用ES6语法时,关于这个主题的所有博客文章和文档都使用相对文件导入,而不是从整个事件发生时的导入通过d.ts文件编译和共享。
那么有没有办法用文本模块名称包装我的重新导出?或者至少告诉index.d.ts包含环境模块? (记住它会为项目中的每个文件输出一个d.ts文件,但我们只关心通过index.d.ts导入模块,因为它会重新导出所有文件。)
答案 0 :(得分:3)
现在,您仍需要使用其他工具为您的包生成单个.d.ts文件。有一些工具可以做到这一点:
就我个人而言,我正在使用一个使用tsconfig.json的customized version of dts-generator,并且可以使用每晚的TypeScript版本。您可以看到它为我的某个包over here生成的.d.ts。
答案 1 :(得分:3)
好的,我终于让它工作了,至少对CommonJS来说很好。
现在使用typescript 1.6更改TS模块分辨率将检查node_modules
文件夹中的index.d.ts
文件。所以我基本上在构建过程结束时添加了这个文件,该文件指向包含所有导出的dist/definitions/index.d.ts
文件。
通过这种方式,您可以执行import * from "my-module"
之类的导入,只要在node_modules
文件夹中您拥有my-module
文件夹并index.d.ts
,它就会基本上处理所有内容该索引作为模块。
如果其他人得到一个适用于所有人的更好的解决方案而不仅仅是普通人,我会很高兴地将答案换成另一个答案,但目前它足以让我继续前进并希望它可以帮助其他人。
答案 2 :(得分:2)
编译ParseQuery
时,需要告诉TSC为您生成定义文件。
index.ts:
query.setLimit(int N)
命令:
index.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
文件才能使其工作,这是目前的PITA;见this。我相信您可以使用some-class-*
选项将所有文件合并为一个文件,其中包括d.ts
。虽然,我也不确定这是你想要的。