我有一个我只想在命名空间(内部模块)中使用的接口,它不应该在命名空间之外使用.
示例界面:
namespace Test {
interface IInterface {
getId(): number;
getName(): string;
}
}
不幸的是,当我尝试在同一名称空间中实现此接口时,如果我不导出接口(我不想这样做),我会收到错误.
实施班级:
namespace Test {
class Implementer implements IInterface {
private location: Location;
public getId(): number {
return 1;
}
public getName(): string {
return "implementer name";
}
}
}
其中给出:TS2304:找不到名称’IInterface’.在’Implementer.ts’中.
请注意类型为“Location”的私有成员,它也是我自己在同一名称空间中定义的新类型/类,这是使用名称空间的实际原因,因为“Location”类型已存在于全局空间中.
如果在名称空间外使用,则名称冲突的类:
namespace Test {
class Location {
private name: string = null;
constructor(name: string) {
this.name = name;
}
}
}
另外:我没有使用任何模块,我正在将一些类型从JavaScript转换为TypeScript类.使用///< reference path =“IInterface.ts”/>帮助器不起作用(这里不是问题).我也不想介绍任何模块加载器.
那么如何在不导出的情况下在相同的命名空间中使用我的界面呢?
最佳答案 我首先回答最后一个问题:“如果在名称空间外使用,则名称冲突的类”.浏览器中已存在
global object Location
.您可以在模块或命名空间中为您的类使用此名称.否则,您将不得不选择其他名称.
然后,您要分割命名空间.只需导出成员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对象”.您可以观察到变量消息无法在其IIFE之外重用.即使我们为同一个全局变量(命名空间)测试创建第三个IIFE.