TypeScript:如何在命名空间中使用内部接口(interface)

标签 typescript module namespaces

我有一个接口(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/

相关文章:

linux - 如何在内核模块中将网络接口(interface)设置为混杂模式?

c++ - 命名空间和前向声明问题

c++ - 将 boost::intrusive_ptr 与嵌套类一起使用

javascript - 在数组中存储数据时出现类型错误

node.js - 没有为 channel 注册的处理程序 - Electron IPC 处理/调用

angular - 如何在 MatSnackBar 中使用垫子图标?

dll - 命名空间何时应该成为它们自己的独立类库?

node.js - Angular 7 : Uncaught ReferenceError: global is not defined when adding package

c - Beaglebone Black GPIO 控制非常缓慢地运行步进电机。我怎样才能提高速度?

python - 导入python类,相对于哪里?