【问题标题】:Is there a typescript List<> and/or Map<> class/library? [closed]是否有打字稿 List<> 和/或 Map<> 类/库? [关闭]
【发布时间】:2014-05-30 13:08:54
【问题描述】:

他们是否在 typepad 1.0 中添加了运行时 List 和/或 Map 类型类?如果没有,是否有人编写了一个可靠的库来提供此功能?

对于 List,是否存在链表,其中链表中的元素具有 next/prev 属性?我们需要一个列表,从元素对象(即不是来自迭代器)中,我们可以获取列表中的下一个和前一个元素(如果是第一个/最后一个则为 null)。

【问题讨论】:

  • Typescript 只是 JavaScript 的扩展,编译为 Javascript,它为 JavaScript 添加了数据类型和一些“即将推出”的功能。它根本没有运行时。
  • 我相信 Angular 做了你想要的:Collection.ts
  • 看看Script4J,这是一组使用 Java API 在 TypeScript/JavaScript 中编写程序的库。虽然是一个新项目,但非常有趣。

标签: collections typescript


【解决方案1】:

他们是否将运行时 List 和/或 Map 类型类添加到 typepad 1.0

不,提供运行时不是 TypeScript 团队的重点。

是否有人编写了一个可靠的库来提供此功能?

我写道(实际上只是将存储桶移植到打字稿):https://github.com/basarat/typescript-collections

更新

JavaScript / TypeScript 现在原生支持此功能,如果需要,您可以使用 lib.d.ts : https://basarat.gitbooks.io/typescript/docs/types/lib.d.ts.html 以及 polyfill 启用它们?

【讨论】:

  • 关于使用它的一个注意事项 - 如果使用 requireJS,您还需要在使用之前显式加载文件。
  • 你好。仅供参考,您的集合(我喜欢)不能用于传递给/从网络工作者的对象中。 LinkedList 将删除它包含的所有对象。并且字典会抛出一个不可序列化的异常。
  • 他们不通过 - 有时。很奇怪,列表在某些情况下是填充的,在其他情况下是空的。我正试图找出原因。
  • 你好。好的, Dictionary.toStr 是问题所在。如果我在 postMessage 调用之前在调试器中将其设置为 null 或 undefined,那么一切正常。但如果这是默认功能 - 无法发布。
  • 什么是桶?
【解决方案2】:

你自己写很容易,这样你就可以更好地控制事情了.. 正如其他答案所说,TypeScript 的目的不是添加运行时类型或功能。

地图:

class Map<T> {
    private items: { [key: string]: T };

    constructor() {
        this.items = {};
    }

    add(key: string, value: T): void {
        this.items[key] = value;
    }

    has(key: string): boolean {
        return key in this.items;
    }

    get(key: string): T {
        return this.items[key];
    }
}

列表:

class List<T> {
    private items: Array<T>;

    constructor() {
        this.items = [];
    }

    size(): number {
        return this.items.length;
    }

    add(value: T): void {
        this.items.push(value);
    }

    get(index: number): T {
        return this.items[index];
    }
}

我尚未测试(甚至尝试编译)此代码,但它应该为您提供一个起点.. 然后您当然可以更改您想要的任何内容并添加您需要的功能...

至于列表中的“特殊需求”,我认为没有理由实现链接列表,因为 javascript 数组允许您添加和删除项目。
这是 List 的修改版本,用于处理来自元素本身的 get prev/next:

class ListItem<T> {
    private list: List<T>;
    private index: number;

    public value: T;

    constructor(list: List<T>, value: T, index: number) {
        this.list = list;
        this.index = index;
        this.value = value;
    }

    prev(): ListItem<T> {
        return this.list.get(this.index - 1);
    }

    next(): ListItem<T> {
        return this.list.get(this.index + 1);   
    }
}

class List<T> {
    private items: Array<ListItem<T>>;

    constructor() {
        this.items = [];
    }

    size(): number {
        return this.items.length;
    }

    add(value: T): void {
        this.items.push(new ListItem<T>(this, value, this.size()));
    }

    get(index: number): ListItem<T> {
        return this.items[index];
    }
}

您也在查看未经测试的代码..

希望这会有所帮助。


编辑 - 因为这个答案仍然得到一些关注

Javascript 有一个原生的Map object,所以不需要自己创建:

let map = new Map();
map.set("key1", "value1");
console.log(map.get("key1")); // value1

【讨论】:

  • 我刚刚意识到,如果从列表中插入/删除项目,您的最终程序将无法运行,因为该元素的索引值将不同。
  • 当然,正如我所写,这是一个简单的代码让你开始,你需要实现那种东西,就像使用迭代器一样
  • 没有删除方法?
  • @baraber 好吧,正如我所写的,这只是一个如何自己实现事物的示例。添加删除方法非常简单。我可以编辑添加一个,你指的是哪个类?
  • @IamStalker 我创建的Map类使用js对象作为底层数据结构,js对象中的所有键都是字符串,这就是为什么我的类对值只有一个通用约束。 es6 Map 对象确实支持其他类型的键,这就是为什么它在定义文件中有两个通用约束。
猜你喜欢
  • 2021-10-25
  • 2012-09-25
  • 1970-01-01
  • 2017-01-18
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多