我正在开发一个TypeScript项目(用于浏览器),我们正在使用第四方库,其中的类型定义来自DefinitelyTyped。在库的类型定义中,它的类声明如下:
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
的导出类型别名/提取为全局变量?
答案 0 :(得分:1)
有一种专用语法可以从名称空间中提取内容。
import Bar = foo.Bar;
将相应命名的类型,值和/或命名空间放在名为Bar
的单个术语的范围内。
确保将其置于环境上下文中,例如d.ts
文件或嵌套在declare
上下文中。
如果foo
在运行时本身不存在,那么声明确实需要修复。
然而,这只是你第一次工作的简写,你应该做的是发送一个拉取请求来明确键入以修复声明,因为它已经坏了。
另请注意,不应使用涉及扩展Bar
的第二个解决方案,因为它会以意想不到的方式更改程序的行为。