Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript:在全局命名空间中别名命名空间声明_Typescript_Definitelytyped - Fatal编程技术网

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

TypeScript:在全局命名空间中别名命名空间声明,typescript,definitelytyped,Typescript,Definitelytyped,我正在从事一个TypeScript项目(用于浏览器),其中我们使用第三方库,其中包含来自DefiniteTyped的类型定义。在库的类型定义中,其类声明如下: declare namespace foo { export class Bar { ... } export class Baz { ... } } 但是,库的实际实现将类放在全局范围内,这样就可以通过Bar和Baz引用它们。因此,使用foo.Bar将进行编译,但在运行时不起作用 为了使它能够工作,我想以某种方式将fo

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

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可以编译,但在运行时不起作用。”