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

Jam*_*mes 7 typescript definitelytyped

我正在开发一个 TypeScript 项目(针对浏览器),我们在其中使用带有 DefinelyTyped 的类型定义的第三方库。在库的类型定义中,其类声明如下:

declare namespace foo {
    export class Bar { ... }
    export class Baz { ... }
}
Run Code Online (Sandbox Code Playgroud)

Bar然而,库的实际实现将类放置在全局范围内,以便可以仅通过和来引用它们Baz。因此,usingfoo.Bar会编译,但在运行时不起作用。

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

declare type Bar = foo.Bar;
declare const Bar: typeof foo.Bar;
Run Code Online (Sandbox Code Playgroud)

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

declare class Bar extends foo.Bar {}
Run Code Online (Sandbox Code Playgroud)

但现在我不必要地延长课程,而且意图不明确。

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

Alu*_*dad 7

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

import Bar = foo.Bar;
Run Code Online (Sandbox Code Playgroud)

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

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

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

然而,这只是您的第一个解决方案的简写,您实际上应该做的是将拉取请求发送到definitely typed 来修复声明,因为它已损坏。

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