Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在Typescript中创建类[]运算符吗_Typescript_Typescript1.4 - Fatal编程技术网

我可以在Typescript中创建类[]运算符吗

我可以在Typescript中创建类[]运算符吗,typescript,typescript1.4,Typescript,Typescript1.4,是否有方法覆盖typescript中的[]操作?我们使用1.4,因此我们可以使用需要1.4的解决方案 更新:我在最初的问题中非常不清楚。我的意思是我可以把它作为操作符添加到类中。在我的课堂上,我目前有一种方法: public get(index : number) : LinkedListNode<t> { if (this._first === null || (index >= this._count)) { return null; }

是否有方法覆盖typescript中的[]操作?我们使用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;
}
公共获取(索引:编号):LinkedListNode{ if(this._first==null | |(index>=this._count)){ 返回null; } var node=这个。\首先; 而(索引-->0){ 节点=节点。\u下一步; } 返回节点; } 我希望能够调用data[5],而不是data.get(5)

有办法做到这一点吗


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

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

相反,您可以手动使用对象。。 例如:

var objtest={first:“一”,second:“两”}
然后您可以这样使用每个元素:

objtest.first;——输出一
第二个目标;——产出二
如果需要,可以将其用作每个变量

例如:

var first=“一”;
var second=“两”

我更喜欢用第一种方法


我希望这有帮助

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

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

Update 作为对您问题更新的回应,不,不可能为您不能执行
data[5]
而不是
data.get(5)
的类重载索引运算符

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

原始答案 无法更改以下结果:

var a = [];
想象一下,如果允许人们改变这种行为,会出现什么问题?库A可以用一种方式定义它,然后库B可以用自己的行为覆盖它。。。意思是库B现在使用库A的
[]
行为

您可以做的是将方法添加到
数组的原型中:

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

Array.prototype.log = function() {
    console.log(JSON.stringify(this));
};
然后使用:

var a = [];
a.log();
但是,不建议这样做!您不应该修改您不拥有的对象,因为这可能会导致无法预见的问题。不这样做的原因类似于改变
[]
的行为会导致问题的原因:

  • 库A定义了
    log
    方法
  • 库B定义了一个工作方式不同的
    log
    方法
  • 现在库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));
        }
    }
    
    类MyArray实现数组{
    私有_underyingarray:Array=[];
    //在这里实现数组的方法
    日志(){
    log(JSON.stringify(this._underyingarray));
    }
    }
    
    或创建帮助器类:

    class ArrayHelper {
        static log<T>(a: Array<T>) {
            console.log(JSON.stringify(a));
        }
    }
    
    类阵列帮助器{
    静态日志(a:数组){
    log(JSON.stringify(a));
    }
    }
    
    为什么出于兴趣而要这样做?作为您,我怀疑Typescript是否支持它。@X.L.Ant您的怀疑是正确的。没有。不,也不要这样做。我更新了我的问题,这显著地改变了它,因此改变了答案。很抱歉造成混淆。很抱歉,您的答案没有提到重载
    []
    。您提到的是重载和非重载,这意味着我没有做错任何事情,请在我的帖子上投票。您的答案没有提到在调用
    []
    时执行不同的操作。“重写操作”。是的,从字面上说,你是对的!我投票非常感谢:)太感谢你了。我更新了我的问题,这大大改变了它,因此改变了答案。抱歉搞混了。是的,我看到了。我更新了我的答案来回答它,但也保留了原来的答案,以防对其他人有所帮助。