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:如何在命名空间中使用内部接口的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 从类 + 命名空间拆分接口

Typescript - 如何访问通过命名空间声明的类?

TypeScript:用其他东西替换命名空间

TypeScript 命名空间

如何使用 TypeScript 在接口中定义对象的命名数组?

TypeScript:如何使现有的命名空间成为全局的?