TypeScript 使用命名空间创建模块

vsaztqbk  于 9个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(141)

将编译器标志添加到导出命名空间,以便它们可以用于创建模块或向编译中插入一行代码,以便开发人员这样做。

🔍 搜索词

模块命名空间组合导出导入

✅ 可实现性检查清单

我的建议满足以下准则:

  • 这不会对现有的TypeScript/JavaScript代码造成破坏性的更改
  • 这不会改变现有JavaScript代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的JS的情况下实现
  • 这不是一个运行时特性(例如库功能、带有JavaScript输出的非ECMAScript语法、JS的新语法糖等)
  • 这个特性将与 TypeScript's Design Goals 的其他部分一致。

⭐ 建议

似乎可以轻松地在保持TypeScript的命名空间和所有文件的组合编译输出的同时创建es-module。而且这不会使用bundlers膨胀你的工具栈,也不会因为每个文件都需要导入和导出或者需要创建barrel-files而使你的代码变得混乱。
在编译后的js文件中,只需在开头添加
export var <namespace> = {}
即可。
如果有一个编译器标志可以添加这一行,那就太好了。作为一个粗略的替代方案,已经有了一个编译器指令,可以将下一行代码插入到编译中,例如
//@ts-insert
到目前为止,它似乎只适用于使用命名空间或模块中的一个。一旦使用了其中一个,就不能使用另一个。我不认为有必要排除另一个选项。

📃 激励示例

查看 https://github.com/JirkaDellOro/TS-Namespaces-ES-Modules

💻 用例

任何结合了命名空间和模块优点的使用场景。

qmelpv7a

qmelpv7a1#

"这不是运行时特性"复选框的意思是"这比namespace已经拥有的运行时特性不更多了吗?"

qltillow

qltillow2#

这难道不比命名空间更像是一个运行时特性吗?
精彩的问题。

u4vypkhs

u4vypkhs3#

正确

50pmv0ei

50pmv0ei4#

如果我理解这个建议的话,我们确实有责任自己为这个项目添加TypeScript。
在 TypeScript/Gulpfile.js 文件的第157行到第161行:

  1. const createTypescriptDts = () => src("built/local/typescriptServices.d.ts")
  2. .pipe(newer("built/local/typescript.d.ts"))
  3. .pipe(append("
  4. export = ts;"))
  5. .pipe(rename("typescript.d.ts"))
  6. .pipe(dest("built/local"));

在 TypeScript/src/services/exportAsModule.ts 文件的第1行到第7行:

  1. // 这里我们将TypeScript服务作为外部模块暴露出来,以便像节点模块一样轻松地消费它。
  2. // @ts-ignore
  3. /* @internal */ declare const module: { exports: {} };
  4. if (typeof module !== "undefined" && module.exports) {
  5. module.exports = ts;
  6. }

这些天我们一直在努力迁移到外部模块,但这是一个漫长的过程。

展开查看全部
oug3syen

oug3syen5#

@DanielRosenwasser 感谢分享,这很有趣。让每个人都有创建复合编译的选项,使用esnext从你的命名空间代码中创建模块,并像你上面展示的那样将模块暴露出来以便在命名空间项目中使用它们,这是否合理?似乎只需要几行代码就可以将其输出到已经存在的编译中来解决所有这些问题。
一个编译指令,如//@ts-insert,可以在不处理的情况下发出以下行,它本身就可以作为解决这个问题的临时措施。

相关问题