Подтвердить что ты не робот

Существует ли typescript Список <> и/или Карта <> класс/библиотека?

Добавили ли они класс runtime List < > и/или Map < > type в typepad 1.0? А если нет, есть ли там сплошная библиотека, которую кто-то написал, которая предоставляет эту функциональность?

И в случае List < > существует ли связанный список, в котором элементы в списке имеют свойство next/prev? Нам нужен список, где из элемента элемента (т.е. Не из итератора) мы можем получить следующий и предыдущие элементы в списке (или null, если он первый/последний).

4b9b3361

Ответ 1

Они добавили класс List List < > и/или Map < > type в typepad 1.0

Нет, обеспечение времени выполнения не является фокусом команды TypeScript.

есть ли сплошная библиотека, которую кто-то написал, которая предоставляет эту функциональность?

Я написал (на самом деле просто портирован на ведра до typescript): https://github.com/basarat/typescript-collections

Ответ 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 позволяет добавлять и удалять элементы.
Здесь приведена модифицированная версия списка для обработки 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 имеет собственный объект карты, поэтому нет необходимости создавать свои собственные:

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