我有一个接口(interface),我只想在命名空间(内部模块)内使用,不应在命名空间外使用。
示例界面:
namespace Test {
interface IInterface {
getId(): number;
getName(): string;
}
}
不幸的是,如果我不导出接口(interface)(我不想导出),当我尝试在同一个命名空间中实现该接口(interface)时会出错。
实现类:
namespace Test {
class Implementer implements IInterface {
private location: Location;
public getId(): number {
return 1;
}
public getName(): string {
return "implementer name";
}
}
}
给出:TS2304:在“Implementer.ts”中找不到名称“IInterface”。。
注意类型“Location”的私有(private)成员,它也是我在同一命名空间中定义的新类型/类,这是使用命名空间的实际原因,因为类型“Location”已经存在于全局空间中。
如果在命名空间之外使用则名称冲突的类:
namespace Test {
class Location {
private name: string = null;
constructor(name: string) {
this.name = name;
}
}
}
另外:我没有使用任何模块,而是将某些类型从 JavaScript 转换为 TypeScript 类。使用 /// <reference path="IInterface.ts" />
助手不起作用(这里不是问题)。我也不想介绍任何模块加载器。
那么如何在不导出接口(interface)的情况下在同一个命名空间中使用我的接口(interface)呢?
最佳答案
我首先回答最后一个问题:“如果在命名空间之外使用,则名称冲突的类”。 global object Location
已经存在于浏览器中。您可以在模块或 namespace 中为您的类使用此名称。否则,您将不得不选择另一个名称。
然后,你想拆分一个命名空间。只需导出
成员IInterface
,以便在 IIFE 之外公开它:
namespace Test {
export interface IInterface {
getId(): number;
getName(): string;
}
}
说明
来自 the handbook :
Namespaces are simply named JavaScript objects in the global namespace.
这是一个例子(见代码 in the TS Playground ):
namespace Test {
export let name = 'abc'
}
namespace Test {
let message = 'Hello, ' + name;
}
编译后的JavaScript代码如下:
var Test;
(function (Test) {
Test.name = 'abc';
})(Test || (Test = {}));
var Test;
(function (Test) {
var message = 'Hello, ' + Test.name;
})(Test || (Test = {}));
命名空间 Test
是一个“在全局命名空间中简单命名的 JavaScript 对象”。您可以观察到变量 message
无法在其 IIFE 之外重用。即使我们为同一个全局变量(命名空间)创建第三个 IIFE Test
。
关于TypeScript:如何在命名空间中使用内部接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39917773/