TypeScript:在全局命名空间中别名命名空间声明
我正在从事一个TypeScript项目(用于浏览器),其中我们使用第三方库,其中包含来自DefiniteTyped的类型定义。在库的类型定义中,其类声明如下:TypeScript:在全局命名空间中别名命名空间声明,typescript,definitelytyped,Typescript,Definitelytyped,我正在从事一个TypeScript项目(用于浏览器),其中我们使用第三方库,其中包含来自DefiniteTyped的类型定义。在库的类型定义中,其类声明如下: declare namespace foo { export class Bar { ... } export class Baz { ... } } 但是,库的实际实现将类放在全局范围内,这样就可以通过Bar和Baz引用它们。因此,使用foo.Bar将进行编译,但在运行时不起作用 为了使它能够工作,我想以某种方式将fo
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
类型别名/提取为globals?有专门的语法用于从名称空间提取内容
import Bar = foo.Bar;
将相应命名的类型、值和/或名称空间放入名为Bar
的单个术语下的范围
确保将其放置在环境上下文中,如d.ts
文件,或嵌套在declare
上下文中
如果foo
本身在运行时不存在,那么该声明确实需要修复
然而,这只是您第一次使用的一个简写,您实际上应该做的是向用户发送一个pull请求来修复声明,因为它已损坏
还请注意,不应使用涉及扩展
条的第二个解决方案,因为它将以意外方式更改程序的行为。我可以问一下哪个软件包吗?这不起作用。这将编译为var Bar=foo.Bar
,但foo
未定义。@GregRos只有在OP的声明命名空间foo
与运行时值不对应时,这才是真的。这将使声明错误,因为它包含值。从问题的描述来看,情况似乎确实如此Bar
实际上不在名为foo
的命名空间中。这是全球范围内的。@GregRos啊,也许我误解了。我的印象是它们在合格和不合格的上下文中都可用。在问题中:“因此,使用foo.Bar可以编译,但在运行时不起作用。”