TypeScript:全局命名空间中的别名空间声明

时间:2018-02-13 20:31:51

标签: typescript definitelytyped

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

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

但是,库的实际实现将类放在全局范围内,以便只能BarBaz引用它们。因此,使用foo.Bar将编译,但不会在运行时工作。

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

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

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

declare class Bar extends foo.Bar {}

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

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

1 个答案:

答案 0 :(得分:1)

有一种专用语法可以从名称空间中提取内容。

import Bar = foo.Bar;

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

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

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

然而,这只是你第一次工作的简写,你应该做的是发送一个拉取请求来明确键入以修复声明,因为它已经坏了。

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