【问题标题】:Can I create a class [] operator in Typescript我可以在 Typescript 中创建一个类 [] 运算符吗
【发布时间】:2015-06-20 06:34:45
【问题描述】:

有没有办法覆盖打字稿中的 [] 操作?我们使用 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;
}

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

有没有办法做到这一点?

感谢和抱歉最初的问题非常不准确。

【问题讨论】:

  • 你为什么要出于兴趣?
  • 正如你 can't in Javascript,我怀疑 Typescript 是否支持它。
  • @X.L.Ant 你的疑惑是正确的。它没有。
  • 不,不要这样做。
  • 我更新了我的问题,这大大改变了它 - 因此改变了答案。很抱歉造成混乱。

标签: typescript typescript1.4


【解决方案1】:

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

除此之外,您可以手动使用对象.. 示例:

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

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

示例: var first = "one"; var second = "two" ;

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

我希望它有所帮助。

【讨论】:

  • 抱歉,您的回答没有提到重载[]
  • 你说的是 OVERRIDE 而不是 OVERLOAD,这意味着我没有做错任何事,请为我的帖子投票。
  • [] 被调用时,你的答案没有解决做不同的事情。
  • “覆盖操作”。是的,从字面上看,你是对的!我赞成。 ;)
  • 非常感谢 :) 你真好。
【解决方案2】:

在 JavaScript / TypeScript 中不能重载运算符。

使用 ECMAScript 6,您将能够使用 iterators。 TypeScript 1.5 在目标 ES6 中添加了the support of Symbols。但是迭代器在以 ES5/3 为目标的 TypeScript 中不可用。

【讨论】:

    【解决方案3】:

    更新

    针对您对问题的更新,不,不可能为类重载索引运算符 - 您不能使用 data[5] 而不是 data.get(5)

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

    原答案

    无法更改以下结果:

    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 的方法。

    推荐

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

    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));
        }
    }
    

    【讨论】:

    • 我更新了我的问题,大大改变了它 - 因此改变了答案。很抱歉造成混乱。
    • 是的,我看到了。我更新了我的答案来回答它,但也保留了原来的答案,以防它帮助别人。
    猜你喜欢
    • 2012-01-15
    • 2011-01-13
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多