我可以在Typescript中创建一个class []运算符

时间:2015-04-14 15:07:00

标签: typescript typescript1.4

有没有办法覆盖打字稿中的[]操作?我们使用1.4,因此我们可以使用需要1.4的解决方案。

更新:我在最初的问题中非常不清楚。我的意思是我可以将其作为操作符添加到类中。在我的班上,我现在有一个方法:

public get(index : number) : LinkedListNode<t> {

    if (this._first === null || (index >= this._count)) {
        return null;
    }
    var node = this._first;
    while (index-- > 0) {
        node = node._next;
    }
    return node;
}

我希望能够调用数据[5]而不是data.get(5)。

有办法做到这一点吗?

谢谢&amp;抱歉这个令人难以置信的不准确的初始问题。

4 个答案:

答案 0 :(得分:7)

更新

为了回复您对问题的更新,不能让某个类的索引运算符超载 - 您无法data[5]而不是data.get(5)。< / p>

在我看来,之所以没有实现,是因为JavaScript允许使用括号访问对象的属性,这会产生一些歧义。例如,如果data.myProperty是一个存在的属性并且调用了data['myProperty'],则很难确定它是否应该返回myProperty属性或者字符串&#39; myProperty& #39;应该传递给索引重载。

原始答案

无法更改结果:

var a = [];

想象一下如果允许人们改变这种行为可能会出现的问题?图书馆A可以通过一种方式定义它,然后图书馆B可以用自己的行为覆盖它...意味着图书馆B现在使用图书馆A的[]行为。

您可以做的是为Array的原型添加方法:

interface Array {
    log: () => void;
}

Array.prototype.log = function() {
    console.log(JSON.stringify(this));
};

然后使用:

var a = [];
a.log();

但是,建议不要这样做!你不应该修改你不拥有的对象,因为它可能会导致无法预料的问题。不这样做的原因类似于更改[]行为会导致问题的原因:

  1. 库A定义了log方法。
  2. 库B定义了一种工作方式不同的log方法。
  3. 现在,图书馆A的log方法无法按预期工作,因为它使用了图书馆B的方法。
  4. <强>建议

    我建议您创建自己的数组实现:

    class MyArray<T> implements Array<T> {
        private _underlyingArray : Array<T> = [];
    
        // implement methods for Array here
    
        log() {
            console.log(JSON.stringify(this._underlyingArray));
        }
    }
    

    或者创建一个帮助类:

    class ArrayHelper {
        static log<T>(a: Array<T>) {
            console.log(JSON.stringify(a));
        }
    }
    

答案 1 :(得分:0)

你不能在JavaScript中重载运算符,因为TypeScript生成JavaScript我认为没有魔法。

Here's Brendan Eich(2011)的答案。

答案 2 :(得分:0)

操作符不能在JavaScript / TypeScript中重载。

使用ECMAScript 6,您将能够使用iterators。 TypeScript 1.5将the support of Symbols添加到目标ES6。但是,使用ES5 / 3作为目标的TypeScript中没有迭代器。

答案 3 :(得分:-4)

通常,数组是变量/值的列表(可能是字符/整数/浮点数)

而不是这个,你可以手动使用对象.. 例如:

var objtest = {first: "one", second:"two"}; 那么你可以这样使用每个元素:

objtest.first; -- outputs one objtest.second; -- outputs two 如果你愿意,你可以将它用作每个变量..

实施例: var first = "one"; var second = "two" ;

我更喜欢使用第一种方式。

我希望它有所帮助。