所以我们假设我有一个50个文件模块,每个模块包含:
export class <SomeClassName> { /* content */ }
然后,我创建一个根文件,通过重新导出所有文件来简化使用.所以它看起来像:
export * from "./src/some-class-1";
export * from "./src/some-class-2";
export * from "./src/some-class-3";
// etc
Run Code Online (Sandbox Code Playgroud)
然后,我通过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导入模块,因为它会重新导出所有内容).
好吧,我终于让它工作了,至少对于 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它基本上就会将该索引中的所有内容视为一个模块。
如果其他人得到一个更好的解决方案,该解决方案适用于所有人而不仅仅是 commonjs,我会很乐意将答案更改为另一个答案,但目前它足以让我继续前进,希望它可以帮助其他人。
| 归档时间: |
|
| 查看次数: |
3214 次 |
| 最近记录: |