如何将模块中的类暴露给 TypeScript 中的全局命名空间?

bni*_*and 7 typescript es6-modules

问题

给定的

  • 我有一个包含模块和全局脚本(常规非模块脚本)的现有应用程序。
    • 模块
      • 应用程序
    • 全局脚本
      • alpha.ts包含一个名为 alpha 的类
      • beta.ts包含一个名为 beta 的类
      • gamma.ts包含一个名为 gamma 的类
  • 我想将全局脚本(gamma.ts)中的一个类转换为一个模块
    • 通过在gamma.ts 中添加export defaultbefore class gamma {}
  • 我想将类gamma导入全局命名空间(即窗口对象),以便现有的全局和模块脚本可以访问它。

我试过的

我在global.d.ts周围尝试了很多东西

例如

import gammaAlias from "../scripts/gamma";
export as namespace NS_Global;

declare global {
    var qqq: {n:string};
    namespace ZZZ {
       export var gamma: gammaAlias;
    }
    var gamma: gammaAlias;
}
Run Code Online (Sandbox Code Playgroud)

但没有一个有效

即打字稿告诉我以下之一

  • 伽马不存在
  • Cannot use 'new' with an expression whose type lacks a call or construct signature.

github

我有一个 github repo 设置来调查这些问题。 https://github.com/penguin020/expose-typescript-modules-globally

ConvertToModulesPOC_original 是工作“之前”的情况。

ConvertToModulesPOC 是将 gamma .ts 转换为模块并在全球公开它的失败尝试。

聚苯乙烯

问题仍然存在,如何将模块暴露给全局命名空间?

任何使用 github 中示例的答案将特别感谢!

bni*_*and 6

我在“ TypeScript:在全局上下文中公开模块类型以及为什么要避免它”中找到了答案;

我已经更新了 github 存储库。

我发现的最显着的变化是:


tsconfig中:

"module": "system",
Run Code Online (Sandbox Code Playgroud)

yMod.ts中

import gammaAlias from "../scripts/gamma.js";

declare global {
    export type gamma = gammaAlias;
    export const gamma: typeof gammaAlias;
}

(window as any).gamma = gammaAlias;
Run Code Online (Sandbox Code Playgroud)

注意:您可以在另一个文件中使用全局环境声明,甚至是 *.d.ts 文件。


上面的链接详细说明了每个符号在全局范围内公开三个引用的原因。该页面上对此进行了很好的解释,因此我仅在此总结:

  1. 将类类型公开给 TypeScript 编译器(不生成代码)
  2. 将类对象暴露给 TypeScript 编译器(因此有一个对象可以调用new;不生成任何代码)
  3. 扩展窗口对象以公开全局命名空间中的类(生成代码)。