我可以将数组访问器添加到通用TypeScript类吗?

时间:2014-08-23 22:47:34

标签: arrays list generics typescript

我有一个列表类,如下所示:

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

    constructor() {
        this._array = new Array<T>();
    }

    get count() { return this._array.length; }

    public add = (state) => {
        this._array.push(state);
    }
    ...
}

我想从类中访问内部数组:

var something = list[0];

在c#中,我会这样做:

public T this[int index]
    {
        get
        {
            return _array[index];
        }
        private set {}
    }
}

但我无法在TypeScript中看到完成此任务。有没有办法在我的类中添加数组访问器,使它看起来更像是通用List?

感谢你的智慧!

1 个答案:

答案 0 :(得分:1)

你可以虽然语法有点奇怪。请注意,由于typescript被编译为js,因此只有数字和字符串才是有效键:

interface IList<T> {
    [index: number]: T
}

interface IMap<T> {
    [index: string]: T
}

interface IMap<K, V> {
    [index: K]: V // Error: Index signature parameter type must be either string or number
}

虽然有诀窍。您实际上无法重载运算符,您只能告诉编译器它存在。例如,如果您有一个希望用作哈希表的通用对象 - 将其声明为Map<T>而不是any。数组也是如此。

实际运用操作符的唯一可能方法是使用数组或对象作为底层元素,将它们声明为IList/IMap,然后调整其属性/原型以添加特定功能。例如,要创建可观察数组,请参阅this answer