有没有办法覆盖打字稿中的[]操作?我们使用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;抱歉这个令人难以置信的不准确的初始问题。
答案 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();
但是,建议不要这样做!你不应该修改你不拥有的对象,因为它可能会导致无法预料的问题。不这样做的原因类似于更改[]
行为会导致问题的原因:
log
方法。 log
方法。 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));
}
}
答案 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" ;
我更喜欢使用第一种方式。
我希望它有所帮助。