我试图设置一些打字稿定义文件,但偶然发现了一个非常有趣的问题。在名称空间(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
?
答案 0 :(得分:0)
当目标是拥有独立的命名空间b
和a.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
之外,因此兼容性没有无论如何对于运行时都没有关系。