首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将模块中的类公开给TypeScript中的全局命名空间?

如何将模块中的类公开给TypeScript中的全局命名空间?
EN

Stack Overflow用户
提问于 2019-11-22 19:00:26
回答 3查看 2.2K关注 0票数 7

问题

给定的

  • 我有一个包含模块和全局脚本(常规非模块脚本)的现有应用程序。
    • 模块
      • App.ts

代码语言:javascript
运行
复制
- global scripts  
    - **alpha.ts** contains a class named alpha
    - **beta.ts** contains a class named beta
    - **gamma.ts** contains a class named gamma

  • 我想将全局脚本中的一个类(gamma.ts)转换为模块
    • 通过在export default gamma.ts中在class gamma {}之前添加gamma.ts

  • 我希望将类gamma导入全局命名空间(即窗口对象),以便现有的全局和模块脚本能够访问它。

我试过的

我试过很多关于global.d.ts的东西

例如:

代码语言:javascript
运行
复制
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中的例子的答案都将被特别感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-26 20:39:22

我在“TypeScript:在全局上下文中公开模块类型及其避免的原因”中找到了答案;

我已经更新了github回购系统。

我发现最显著的变化是:

tsconfig__中:

代码语言:javascript
运行
复制
"module": "system",

yMod.ts

代码语言:javascript
运行
复制
import gammaAlias from "../scripts/gamma.js";

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

(window as any).gamma = gammaAlias;

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

链接在上面详细分析了对每个符号进行全局公开的三个引用的原因。在这一页上已经很好地解释了这一点,所以我只在这里总结一下:

  1. 将类类型公开给TypeScript编译器(没有生成代码)
  2. 将类对象公开给TypeScript编译器(因此有一个对象可以调用新;没有生成代码)
  3. 扩展窗口对象以公开全局命名空间中的类(生成代码)。
票数 5
EN

Stack Overflow用户

发布于 2019-12-01 19:35:52

我希望我正确理解了你的问题。您希望将“gamma”公开到全局命名空间,以便直接从“窗口”或控制台调用“gamma.log()”?

将以下2行添加到类底部的gamma.ts中。

代码语言:javascript
运行
复制
let g = new gamma();
(window as any).gamma = g

1)第一行将一个新的Gamma类初始化为变量g

2)第二行将g导出到全局命名空间,以便可以从'window.g‘或简单地'g’调用它。

屏幕截图

拉出请求1:https://github.com/penguin020/expose-typescript-modules-globally/pull/1/files

我还建议将这两行代码移到主初始化文件'app.js‘中。

gamma.ts

代码语言:javascript
运行
复制
export default class gamma {

app.ts

代码语言:javascript
运行
复制
import gamma from "./gamma";
let g = new gamma();
(window as any).gamma = g

拉出请求2:https://github.com/penguin020/expose-typescript-modules-globally/pull/2

票数 1
EN

Stack Overflow用户

发布于 2020-02-28 18:50:40

这对我有用。我只希望不用重命名界面。

代码语言:javascript
运行
复制
declare global {
  interface IMyClass extends MyClass { }
}

class MyClass {

}

代码语言:javascript
运行
复制
declare global {
  type IMyClass = MyClass;
}

class MyClass {

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59000222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档