Typescript从名称空间中访问根名称空间

时间:2019-11-12 15:10:06

标签: typescript

我试图设置一些打字稿定义文件,但偶然发现了一个非常有趣的问题。在名称空间(a)内,我想访问其他名称空间(b.Clazz)的成员。此方法有效,但前提是不存在嵌套的命名空间(a.b)。如果没有这样的嵌套名称空间,则TS能够解决此依赖性。如果存在这样的命名空间,它将返回类型b.Clazz解释为a的本地类型,然后显示错误,指出没有a.b.Clazz。最小示例:

declare namespace a {
    function foo(): b.Clazz
    namespace b {
        // remove this empty namespace to remove the error
    }
}

declare namespace b {
    export class Clazz {

    }
}

如何防止这种情况发生?如何注释函数foo以实际引用全局命名空间b

1 个答案:

答案 0 :(得分:0)

当目标是拥有独立的命名空间ba.b时,我已经成功地通过globalThis变量从b内部访问了外部命名空间a ,这是指向全局范围的指针。

declare namespace a {
  function foo(): globalThis.b.Clazz
  namespace b { }
}

declare namespace b {
  export class Clazz { }
}

a.foo() //  function a.foo(): b.Clazz

顺便说一句:尽管在浏览器中globalThis实现是not so well supported,但我们只是在这里使用 type 到达命名空间a之外,因此兼容性没有无论如何对于运行时都没有关系。