如何在当前命名空间中引用与外部命名空间同名的命名空间?

3

请考虑以下TypeScript:

export namespace Test {
    export const test = "test";
}
export namespace Wrapper {
    export namespace Test {
        export const value = Test.test; // "<script>".Wrapper.Test has no exported member 'test'.
    }
}

由于 TypeScript 将编译成 JavaScript 的方式,Wrapper 中的第二个 Test 声明将创建一个新的作用域,在该作用域中,Test 仅引用自身。根据 TypeScript 类型检查器的说法,顶层的 Test 在该作用域内不可用。
我正在从另一种语言生成 TypeScript,其中这种名称空间冲突并不是什么大问题。然而,在 TypeScript 中,它会导致编译错误。应用程序仍然运行,因此这似乎是 TypeScript 类型检查问题,而不是真正的 JavaScript 运行时问题。
在 TypeScript 中是否有任何已知的解决方法?
我在Gluon issue中建立了一个复制集。
1个回答

1
你可以创建一个别名来解决命名空间冲突问题:
export namespace Test {
    export const test = "test";
}

import _Test = Test;

export namespace Wrapper {
    export namespace Test {
        export const value = _Test.test;
    }
}

谢谢,比尔。我觉得我也可以通过代码生成来解决这个问题,但这真的应该是类型检查器的问题吗?在运行时似乎这是有效的JavaScript。 - panesofglass
“namespace” 是 TypeScript(不是 JavaScript)的构造。它编译成一个函数包装器。你可以自己编译一下,看看实际的 JavaScript 长什么样子。你会发现 JS 实际上看起来很像上面的代码,并且实际上存在相同的命名问题。 - Bill Barnes
似乎TypeScript团队已经意识到了这个问题 - 可以查看Anders Hejlsberg提交的拒绝引入全局作用域引用的功能请求 - Steve Willcock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接