TypeScript:如何在命名空间中使用内部接口
Posted
技术标签:
【中文标题】TypeScript:如何在命名空间中使用内部接口【英文标题】:TypeScript: How to use internal interface within namespace 【发布时间】:2017-02-16 11:37:30 【问题描述】:我有一个接口,我只想在命名空间(内部模块)中使用,并且不应该在命名空间之外使用。
示例界面:
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:在“Implementer.ts”中找不到名称“IInterface”。。
注意“Location”类型的私有成员,它也是我在同一命名空间中定义的新类型/类,这就是使用命名空间的实际原因,因为“Location”类型已经存在于全局空间中。
在命名空间外使用时名称冲突的类:
namespace Test
class Location
private name: string = null;
constructor(name: string)
this.name = name;
另外:我没有使用任何模块,而是将一些类型从 javascript 转换为 TypeScript 类。使用 /// <reference path="IInterface.ts" />
助手不起作用(这不是问题)。我也不想介绍任何模块加载器。
那么如何在不导出的情况下在同一个命名空间中使用我的接口?
【问题讨论】:
可能相关:***.com/questions/39827281/… 另一个问题没有提到内部接口或名称空间或模块中接口的可访问性 是的,但是如果你开始一个新项目,也许你应该考虑切换到模块。这只是一个建议。 :) 【参考方案1】:我首先回答最后一个问题:“如果在命名空间之外使用,则名称冲突的类”。浏览器中已存在global object Location
。您可以在模块或命名空间中为您的类使用此名称。否则,您将不得不选择其他名称。
然后,您想要拆分命名空间。只需export
成员IInterface
即可将其暴露在IIFE 之外:
namespace Test
export interface IInterface
getId(): number;
getName(): string;
说明
来自the handbook:
命名空间只是全局命名空间中命名的 JavaScript 对象。
这是一个插图(见代码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 之外重用。即使我们为同一个全局变量(命名空间)Test
创建第三个 IIFE。
【讨论】:
第一次导出将使接口可以在命名空间或模块之外访问,因此这是不需要的。已经存在的名称问题不应该通过重命名我自己的对象来处理。命名空间和模块主要是为了解决这个问题。 @Huupke,我添加了解释。以上是关于TypeScript:如何在命名空间中使用内部接口的主要内容,如果未能解决你的问题,请参考以下文章