Typescript ile bir sınıf [] operatörü oluşturabilir miyim?

Typescript içindeki [] işlemini geçersiz kılmanın bir yolu var mı? 1.4'ü kullanıyoruz, bu yüzden 1.4 gerektiren bir çözümle iyiyiz.

Update: I was horribly unclear in my initial question. What I meant was can I add that as an operator to a class. In my class I presently have a method:

public get(index : number) : LinkedListNode {

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

Data.get (5) yerine veriyi [5] arayabilirim.

Bunu yapmanın bir yolu var mı?

thanks & sorry for the incredibly inaccurate initial question.

1
Sorunu önemli ölçüde değiştiren sorumu güncelledim - ve dolayısıyla cevabı değiştirdim. Karışıklık için üzgünüm.
katma yazar David Thielen, kaynak
Sorunu önemli ölçüde değiştiren sorumu güncelledim - ve dolayısıyla cevabı değiştirdim. Karışıklık için üzgünüm.
katma yazar David Thielen, kaynak
Sorunu önemli ölçüde değiştiren sorumu güncelledim - ve dolayısıyla cevabı değiştirdim. Karışıklık için üzgünüm.
katma yazar David Thielen, kaynak
Sorunu önemli ölçüde değiştiren sorumu güncelledim - ve dolayısıyla cevabı değiştirdim. Karışıklık için üzgünüm.
katma yazar David Thielen, kaynak
katma yazar xlecoustillier, kaynak
Hayır, bunu yapma.
katma yazar Ryan Cavanaugh, kaynak
Hayır, bunu yapma.
katma yazar Ryan Cavanaugh, kaynak
Hayır, bunu yapma.
katma yazar Ryan Cavanaugh, kaynak
Hayır, bunu yapma.
katma yazar Ryan Cavanaugh, kaynak
@ X.L.At şüphelerin doğru değil. Öyle değil.
katma yazar David Sherret, kaynak
@ X.L.At şüphelerin doğru değil. Öyle değil.
katma yazar David Sherret, kaynak
Neden ilgisiz kalmak istiyorsun?
katma yazar BenjaminPaul, kaynak

14 cevap

Güncelleştirme

In response to your Güncelleştirme to your question, no it's not possible to overload the index operator for a class—you can't do data[5] instead of data.get(5).

Kanımca bunun uygulanmamasının nedeni, JavaScript'in bir nesnenin özelliklerine parantez kullanarak erişmesine izin vermesi ve bazı belirsizlikler yaratmasıdır. Örneğin, data.myProperty var olan bir özellikse ve data ['myProperty'] çağrılırsa, myProperty özelliği veya 'myProperty' dizesinin dizine aşırı yüklenme geçirilmesi gerekiyorsa.

Orijinal cevap

Bunun sonucunu değiştirmek mümkün değil:

var a = [];

İnsanların bu davranışı değiştirmesine izin verilirse ortaya çıkabilecek sorunları düşünün? Kütüphane A bunu bir şekilde tanımlayabilir ve Kütüphane B'nin kendi davranışlarıyla üzerine yazabilir ... yani Kütüphane şimdi Kütüphane A'nın [] davranışını kullanır.

Yapabilecekleriniz Array 'ın prototipine yöntemler eklemek:

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

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

Sonra kullan:

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

However, doing this is extremely not recommended! You shouldn't be modifying objects you don't own because it can lead to unforeseen problems. The reason not to do this is similar to why changing []'s behaviour would lead to problems:

  1. Kütüphane A, bir log yöntemini tanımlar.
  2. Kütüphane B, farklı şekilde çalışan bir log yöntemini tanımlar.
  3. Artık Kütüphane A'nın günlüğü yöntemi, Kütüphane B'nin yöntemini kullandığından beklendiği gibi çalışmayacak.

Öneri

Kendi dizi uygulamanızı oluşturmanızı öneririm:

class MyArray implements Array {
    private _underlyingArray : Array = [];

   //implement methods for Array here

    log() {
        console.log(JSON.stringify(this._underlyingArray));
    }
}

Veya yardımcı bir sınıf oluşturun:

class ArrayHelper {
    static log(a: Array) {
        console.log(JSON.stringify(a));
    }
}
4
katma
Sorunu önemli ölçüde değiştiren sorumu güncelledim - ve dolayısıyla cevabı değiştirdim. Karışıklık için üzgünüm.
katma yazar David Thielen, kaynak
Evet gördüm. Cevabımı yanıtlamak için güncelledik, ancak aynı zamanda başkasına yardım etmesi durumunda orijinali de sakladım.
katma yazar David Sherret, kaynak

Güncelleştirme

In response to your Güncelleştirme to your question, no it's not possible to overload the index operator for a class—you can't do data[5] instead of data.get(5).

Kanımca bunun uygulanmamasının nedeni, JavaScript'in bir nesnenin özelliklerine parantez kullanarak erişmesine izin vermesi ve bazı belirsizlikler yaratmasıdır. Örneğin, data.myProperty var olan bir özellikse ve data ['myProperty'] çağrılırsa, myProperty özelliği veya 'myProperty' dizesinin dizine aşırı yüklenme geçirilmesi gerekiyorsa.

Orijinal cevap

Bunun sonucunu değiştirmek mümkün değil:

var a = [];

İnsanların bu davranışı değiştirmesine izin verilirse ortaya çıkabilecek sorunları düşünün? Kütüphane A bunu bir şekilde tanımlayabilir ve Kütüphane B'nin kendi davranışlarıyla üzerine yazabilir ... yani Kütüphane şimdi Kütüphane A'nın [] davranışını kullanır.

Yapabilecekleriniz Array 'ın prototipine yöntemler eklemek:

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

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

Sonra kullan:

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

However, doing this is extremely not recommended! You shouldn't be modifying objects you don't own because it can lead to unforeseen problems. The reason not to do this is similar to why changing []'s behaviour would lead to problems:

  1. Kütüphane A, bir log yöntemini tanımlar.
  2. Kütüphane B, farklı şekilde çalışan bir log yöntemini tanımlar.
  3. Artık Kütüphane A'nın günlüğü yöntemi, Kütüphane B'nin yöntemini kullandığından beklendiği gibi çalışmayacak.

Öneri

Kendi dizi uygulamanızı oluşturmanızı öneririm:

class MyArray implements Array {
    private _underlyingArray : Array = [];

   //implement methods for Array here

    log() {
        console.log(JSON.stringify(this._underlyingArray));
    }
}

Veya yardımcı bir sınıf oluşturun:

class ArrayHelper {
    static log(a: Array) {
        console.log(JSON.stringify(a));
    }
}
4
katma
Sorunu önemli ölçüde değiştiren sorumu güncelledim - ve dolayısıyla cevabı değiştirdim. Karışıklık için üzgünüm.
katma yazar David Thielen, kaynak
Evet gördüm. Cevabımı yanıtlamak için güncelledik, ancak aynı zamanda başkasına yardım etmesi durumunda orijinali de sakladım.
katma yazar David Sherret, kaynak

Güncelleştirme

In response to your Güncelleştirme to your question, no it's not possible to overload the index operator for a class—you can't do data[5] instead of data.get(5).

Kanımca bunun uygulanmamasının nedeni, JavaScript'in bir nesnenin özelliklerine parantez kullanarak erişmesine izin vermesi ve bazı belirsizlikler yaratmasıdır. Örneğin, data.myProperty var olan bir özellikse ve data ['myProperty'] çağrılırsa, myProperty özelliği veya 'myProperty' dizesinin dizine aşırı yüklenme geçirilmesi gerekiyorsa.

Orijinal cevap

Bunun sonucunu değiştirmek mümkün değil:

var a = [];

İnsanların bu davranışı değiştirmesine izin verilirse ortaya çıkabilecek sorunları düşünün? Kütüphane A bunu bir şekilde tanımlayabilir ve Kütüphane B'nin kendi davranışlarıyla üzerine yazabilir ... yani Kütüphane şimdi Kütüphane A'nın [] davranışını kullanır.

Yapabilecekleriniz Array 'ın prototipine yöntemler eklemek:

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

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

Sonra kullan:

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

However, doing this is extremely not recommended! You shouldn't be modifying objects you don't own because it can lead to unforeseen problems. The reason not to do this is similar to why changing []'s behaviour would lead to problems:

  1. Kütüphane A, bir log yöntemini tanımlar.
  2. Kütüphane B, farklı şekilde çalışan bir log yöntemini tanımlar.
  3. Artık Kütüphane A'nın günlüğü yöntemi, Kütüphane B'nin yöntemini kullandığından beklendiği gibi çalışmayacak.

Öneri

Kendi dizi uygulamanızı oluşturmanızı öneririm:

class MyArray implements Array {
    private _underlyingArray : Array = [];

   //implement methods for Array here

    log() {
        console.log(JSON.stringify(this._underlyingArray));
    }
}

Veya yardımcı bir sınıf oluşturun:

class ArrayHelper {
    static log(a: Array) {
        console.log(JSON.stringify(a));
    }
}
4
katma
Sorunu önemli ölçüde değiştiren sorumu güncelledim - ve dolayısıyla cevabı değiştirdim. Karışıklık için üzgünüm.
katma yazar David Thielen, kaynak
Evet gördüm. Cevabımı yanıtlamak için güncelledik, ancak aynı zamanda başkasına yardım etmesi durumunda orijinali de sakladım.
katma yazar David Sherret, kaynak

Güncelleştirme

In response to your Güncelleştirme to your question, no it's not possible to overload the index operator for a class—you can't do data[5] instead of data.get(5).

Kanımca bunun uygulanmamasının nedeni, JavaScript'in bir nesnenin özelliklerine parantez kullanarak erişmesine izin vermesi ve bazı belirsizlikler yaratmasıdır. Örneğin, data.myProperty var olan bir özellikse ve data ['myProperty'] çağrılırsa, myProperty özelliği veya 'myProperty' dizesinin dizine aşırı yüklenme geçirilmesi gerekiyorsa.

Orijinal cevap

Bunun sonucunu değiştirmek mümkün değil:

var a = [];

İnsanların bu davranışı değiştirmesine izin verilirse ortaya çıkabilecek sorunları düşünün? Kütüphane A bunu bir şekilde tanımlayabilir ve Kütüphane B'nin kendi davranışlarıyla üzerine yazabilir ... yani Kütüphane şimdi Kütüphane A'nın [] davranışını kullanır.

Yapabilecekleriniz Array 'ın prototipine yöntemler eklemek:

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

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

Sonra kullan:

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

However, doing this is extremely not recommended! You shouldn't be modifying objects you don't own because it can lead to unforeseen problems. The reason not to do this is similar to why changing []'s behaviour would lead to problems:

  1. Kütüphane A, bir log yöntemini tanımlar.
  2. Kütüphane B, farklı şekilde çalışan bir log yöntemini tanımlar.
  3. Artık Kütüphane A'nın günlüğü yöntemi, Kütüphane B'nin yöntemini kullandığından beklendiği gibi çalışmayacak.

Öneri

Kendi dizi uygulamanızı oluşturmanızı öneririm:

class MyArray implements Array {
    private _underlyingArray : Array = [];

   //implement methods for Array here

    log() {
        console.log(JSON.stringify(this._underlyingArray));
    }
}

Veya yardımcı bir sınıf oluşturun:

class ArrayHelper {
    static log(a: Array) {
        console.log(JSON.stringify(a));
    }
}
4
katma
Sorunu önemli ölçüde değiştiren sorumu güncelledim - ve dolayısıyla cevabı değiştirdim. Karışıklık için üzgünüm.
katma yazar David Thielen, kaynak
Evet gördüm. Cevabımı yanıtlamak için güncelledik, ancak aynı zamanda başkasına yardım etmesi durumunda orijinali de sakladım.
katma yazar David Sherret, kaynak

genellikle, diziler değişkenlerin/değerlerin bir listesidir (belki karakter/tamsayı/değişken)

bunun yerine nesneleri manuel olarak kullanabilirsiniz. Örnek:

var objtest = {first: "one", second:"two"}; then you can use each element this way:

objtest.first; -- outputs one objtest.second; -- outputs two if you want you can use it as each variable..

Example: var first = "one"; var second = "two" ;

İlk yolu kullanmayı tercih ederim.

Umarım yardımcı olmuştur.

3
katma
"Bir işlemi geçersiz kılma" . Evet, tam anlamıyla haklısın! Oy verdim ;)
katma yazar Paleo, kaynak
Yanıtınız, [] çağrıldığında farklı bir şey yapmayı ele almıyor.
katma yazar David Sherret, kaynak
Maalesef, cevabınız [] 'ı aşırı yüklemekten bahsetmiyor.
katma yazar David Sherret, kaynak
OVERRIDE hakkında değil, OVERLOAD hakkında konuştunuz, bu da yanlış bir şey yapmadığım anlamına gelir;
katma yazar Deepak, kaynak
Çok teşekkür ederim :) çok naziksiniz.
katma yazar Deepak, kaynak

genellikle, diziler değişkenlerin/değerlerin bir listesidir (belki karakter/tamsayı/değişken)

bunun yerine nesneleri manuel olarak kullanabilirsiniz. Örnek:

var objtest = {first: "one", second:"two"}; then you can use each element this way:

objtest.first; -- outputs one objtest.second; -- outputs two if you want you can use it as each variable..

Example: var first = "one"; var second = "two" ;

İlk yolu kullanmayı tercih ederim.

Umarım yardımcı olmuştur.

3
katma
"Bir işlemi geçersiz kılma" . Evet, tam anlamıyla haklısın! Oy verdim ;)
katma yazar Paleo, kaynak
Yanıtınız, [] çağrıldığında farklı bir şey yapmayı ele almıyor.
katma yazar David Sherret, kaynak
Maalesef, cevabınız [] 'ı aşırı yüklemekten bahsetmiyor.
katma yazar David Sherret, kaynak
Çok teşekkür ederim :) çok naziksiniz.
katma yazar Deepak, kaynak
OVERRIDE hakkında değil, OVERLOAD hakkında konuştunuz, bu da yanlış bir şey yapmadığım anlamına gelir;
katma yazar Deepak, kaynak

genellikle, diziler değişkenlerin/değerlerin bir listesidir (belki karakter/tamsayı/değişken)

bunun yerine nesneleri manuel olarak kullanabilirsiniz. Örnek:

var objtest = {first: "one", second:"two"}; then you can use each element this way:

objtest.first; -- outputs one objtest.second; -- outputs two if you want you can use it as each variable..

Example: var first = "one"; var second = "two" ;

İlk yolu kullanmayı tercih ederim.

Umarım yardımcı olmuştur.

3
katma
"Bir işlemi geçersiz kılma" . Evet, tam anlamıyla haklısın! Oy verdim ;)
katma yazar Paleo, kaynak
Yanıtınız, [] çağrıldığında farklı bir şey yapmayı ele almıyor.
katma yazar David Sherret, kaynak
Maalesef, cevabınız [] 'ı aşırı yüklemekten bahsetmiyor.
katma yazar David Sherret, kaynak
Çok teşekkür ederim :) çok naziksiniz.
katma yazar Deepak, kaynak
OVERRIDE hakkında değil, OVERLOAD hakkında konuştunuz, bu da yanlış bir şey yapmadığım anlamına gelir;
katma yazar Deepak, kaynak

genellikle, diziler değişkenlerin/değerlerin bir listesidir (belki karakter/tamsayı/değişken)

bunun yerine nesneleri manuel olarak kullanabilirsiniz. Örnek:

var objtest = {first: "one", second:"two"}; then you can use each element this way:

objtest.first; -- outputs one objtest.second; -- outputs two if you want you can use it as each variable..

Example: var first = "one"; var second = "two" ;

İlk yolu kullanmayı tercih ederim.

Umarım yardımcı olmuştur.

3
katma
"Bir işlemi geçersiz kılma" . Evet, tam anlamıyla haklısın! Oy verdim ;)
katma yazar Paleo, kaynak
Yanıtınız, [] çağrıldığında farklı bir şey yapmayı ele almıyor.
katma yazar David Sherret, kaynak
Maalesef, cevabınız [] 'ı aşırı yüklemekten bahsetmiyor.
katma yazar David Sherret, kaynak
Çok teşekkür ederim :) çok naziksiniz.
katma yazar Deepak, kaynak
OVERRIDE hakkında değil, OVERLOAD hakkında konuştunuz, bu da yanlış bir şey yapmadığım anlamına gelir;
katma yazar Deepak, kaynak

Operatörleri JavaScript ile aşırı yükleyemezsiniz ve TypeScript JavaScript oluşturduğundan beri sihir olmadığını farz ediyorum.

Here's an answer from Brendan Eich (2011).

0
katma

Operatörleri JavaScript ile aşırı yükleyemezsiniz ve TypeScript JavaScript oluşturduğundan beri sihir olmadığını farz ediyorum.

Here's an answer from Brendan Eich (2011).

0
katma

Operatörler JavaScript/TypeScript'te aşırı yüklenemez.

ECMAScript 6 ile yineleyicileri kullanabilirsiniz. TypeScript 1.5, hedef ES6'ya Sembollerin desteğini ekler. Ancak yineleyiciler TypeScript'te ES5/3 ile hedef olarak kullanılamaz.

0
katma

Operatörler JavaScript/TypeScript'te aşırı yüklenemez.

ECMAScript 6 ile yineleyicileri kullanabilirsiniz. TypeScript 1.5, hedef ES6'ya Sembollerin desteğini ekler. Ancak yineleyiciler TypeScript'te ES5/3 ile hedef olarak kullanılamaz.

0
katma

Operatörler JavaScript/TypeScript'te aşırı yüklenemez.

ECMAScript 6 ile yineleyicileri kullanabilirsiniz. TypeScript 1.5, hedef ES6'ya Sembollerin desteğini ekler. Ancak yineleyiciler TypeScript'te ES5/3 ile hedef olarak kullanılamaz.

0
katma

Operatörler JavaScript/TypeScript'te aşırı yüklenemez.

ECMAScript 6 ile yineleyicileri kullanabilirsiniz. TypeScript 1.5, hedef ES6'ya Sembollerin desteğini ekler. Ancak yineleyiciler TypeScript'te ES5/3 ile hedef olarak kullanılamaz.

0
katma