【问题标题】:TypeScript: aliasing namespaced declarations in global namespaceTypeScript:在全局命名空间中为命名空间声明起别名
【发布时间】:2018-07-24 07:33:01
【问题描述】:

我正在开发一个 TypeScript 项目(用于浏览器),我们在该项目中使用了一个第三方库,其中包含来自来自 DeveloplyTyped 的类型定义。在库的类型定义中,它的类声明如下:

declare namespace foo {
    export class Bar { ... }
    export class Baz { ... }
}

但是,库的实际实现将类放在全局范围内,这样它们就可以被Bar 和Baz 引用。因此,使用foo.Bar 将编译,但在运行时不起作用。

为了让它工作,我想以某种方式将foo 的所有导出都带入全局命名空间。我找不到任何明显的方法来做到这一点,所以到目前为止我最好的尝试是制作一个环境声明文件说

declare type Bar = foo.Bar;
declare const Bar: typeof foo.Bar;

并为foo 中的每个导出类重复。这允许我实例化类,将其用作类型,并调用它可能具有的任何静态函数,但是为所有导出的类型声明相同的名称两次并不理想。实现相同目标的更短的方法似乎是

declare class Bar extends foo.Bar {}

但现在我在不必要地扩展课程,意图不明确。

有没有更好的方法将foo 的导出类型别名/提取为全局变量?

【问题讨论】:

  • 请问是哪个包?

标签: typescript definitelytyped


【解决方案1】:

有一种从命名空间中提取内容的专用语法。

import Bar = foo.Bar;

将相应命名的类型、值和/或命名空间纳入名为Bar 的单个术语的范围内。

确保将其放置在环境上下文中,例如 d.ts 文件或嵌套在 declare 上下文中。

如果foo本身在运行时不存在,那么声明确实需要修复。

但是,这只是您第一次解决的简写,您实际上应该做的是发送一个拉取请求到确定类型以修复声明,因为它已损坏。

另请注意,不应使用涉及扩展 Bar 的第二种解决方案,因为它会以意想不到的方式改变程序的行为。

【讨论】:

  • 这行不通。这编译为var Bar = foo.Bar,但foo 未定义。
  • @GregRos 仅当 OP 的 declare namespace foo 不对应于运行时值时才会为真。这会使声明错误,因为它包含值。
  • 从问题描述来看确实是这样。 Bar 并不真正位于名为 foo 的命名空间中。它在全球范围内。
  • @GregRos 啊,也许我误解了。我的印象是它们在合格和不合格的情况下都可用。
  • 在问题中:“因此,使用 foo.Bar 将编译,但在运行时不起作用。”
猜你喜欢
  • 2013-08-12
  • 2013-08-16
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
相关资源
最近更新 更多