【问题标题】:How to export only one class (which uses another class) in TypeScript (CommonJS)?如何在 TypeScript(CommonJS)中只导出一个类(使用另一个类)?
【发布时间】:2016-12-18 21:14:53
【问题描述】:

我使用双向链表实现了“最近最少使用的缓存”(LRU 缓存)。链表由在LRUCache 类中使用的节点(Node 类)组成。

要导出我的模块,我使用以下模式:

export class Node { ... }
export class LRUCache { ... }

我正在将我的模块导出为 CommonJS 模块。使用上面的export class 模式,我可以通过以下方式使用我的模块:

var module = require('lru-cache');
var cache = new module.LRUCache();

没关系,但我不喜欢LRUCache 前面的附加“module.”部分。我想像这样使用我的 CommonJS 导出模块:

var LRUCache = require('lru-cache');
var cache = new LRUCache();

所以我把我的代码改成这样:

class Node { ... }
class LRUCache { ... }
export = LRUCache;

但现在 TypeScript 抱怨:

错误 TS4055:来自导出类的公共方法的返回类型已经或正在使用私有名称“节点”。

这是因为LRUCache使用了Node类,而Node在定义export = LRUCache;时没有导出。

我该如何解决这种情况?我正在使用 TypeScript 2.1。

截图:

【问题讨论】:

    标签: javascript typescript module export commonjs


    【解决方案1】:

    使用 typescript 你可以简单地做到:

    import { LRUCache } from "lru-cache";
    let cache = new LRUCache();
    

    它会编译成:

    var lru_cache_1 = require("./lru-cache");
    var cache = new lru_cache_1.LRUCache();
    

    如果您更喜欢使用require,您可以:

    class Node { ... }
    class LRUCache { ... }
    
    export = LRUCache;
    

    然后:

    import LRUCache = require('lru-cache');
    var cache = new LRUCache();
    

    您可以在以下两个文档页面中找到更多相关信息:

    【讨论】:

    • 感谢您的帮助,但这就是我上面解释的内容。问题是我无法使用 TypeScript 编译 class Node { ... } class LRUCache { ... } export = LRUCache; 代码,因为只有 LRUCache 被导出,并且它使用了一个未导出的类 (Node),而 TypeScript 不喜欢这样。
    • 抱歉,错过了。但是import { LRUCache } from "lru-cache"的第一种方法有什么问题呢?
    • 没问题。问题是我不想将我的 LRUCache(用 TS 编写)与 TypeScript 一起使用。我想将它编译为 JavaScript,以便我可以在 Node.js 应用程序(基于 vanilla JavaScript)中使用它。
    • 我明白了。 Node 类是如何使用的?我无法重现错误。
    • 感谢您深入研究。我把它推到了 GitHub。你可以在这里找到它:github.com/wireapp/wire-webapp-lru-cache/blob/greenkeeper/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2021-12-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多