【发布时间】:2020-03-18 21:05:40
【问题描述】:
问题
给定
- 我有一个包含模块和全局脚本(常规非模块脚本)的现有应用程序。
- 模块
- App.ts
- 全局脚本
- alpha.ts 包含一个名为 alpha 的类
- beta.ts 包含一个名为 beta 的类
- gamma.ts 包含一个名为 gamma 的类
- 模块
- 我想将全局脚本 (gamma.ts) 中的一个类转换为模块
- 通过在 gamma.ts 中的
class gamma {}之前添加export default
- 通过在 gamma.ts 中的
- 我想将
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;
}
但没有一个有效
即TypeScript 告诉我以下之一
- 伽玛不存在
Cannot use 'new' with an expression whose type lacks a call or construct signature.
github
我设置了一个 github 存储库来调查这些问题。 https://github.com/penguin020/expose-typescript-modules-globally
ConvertToModulesPOC_original 是工作“之前”的情况。
ConvertToModulesPOC 是将 gamma .ts 转换为 模块并在全球范围内公开它。
PS
问题仍然存在,如何将模块暴露给全局命名空间?
特别感谢任何使用 github 中示例的答案!
【问题讨论】:
-
我认为
declare global只是一个类型声明,它实际上并没有做任何事情。您实际上需要将window.gamma = gammaAlias分配给 create 全局变量。 -
将
modulecompiler option 设置为无或系统应该可以工作。虽然它似乎没有很好地记录,但也许你会通过发出 ES6 模块,然后将它们与 rollup 或 webpack 正确捆绑在一起,这两者都可以选择将各种导出作为全局变量公开。 -
修复了 alpha 问题
-
@Bergi - 我被限制使用 angular cli 进行生产,使用普通 system.js 进行开发。
-
你是说你甚至不能使用tsconfig file?如果您可以共享更多配置可能会有所帮助,例如如何调用 angular cli 以及如何使用 system.js。