typescript1.4 - Typescript'te bir sınıf [] operatörü oluşturabilir miyim


TypeScript'te [] işlemini geçersiz kılmanın bir yolu var mı? Biz 1.4 kullanıyoruz, bu yüzden 1.4 gerektiren bir çözümle sorun değil.

Güncelleme: İlk sorumda korkunç bir şekilde net olmadım. Demek istediğim, bunu bir sınıfa operatör olarak ekleyebilir miyim? Şu anda sınıfımda bir yöntem var:

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.get(5) yerine data[5] çağırabilmeyi tercih ederdim.

Bunu yapmanın bir yolu var mı?

İnanılmaz derecede yanlış olan ilk soru için teşekkürler ve özür dilerim.

Cevap #1

Güncelle

Sorunuza yaptığınız güncellemeye cevaben, hayır bir sınıf için indeks operatörünü aşırı yüklemek mümkün değil—data.get(5) yerine data[5] yapamazsınız.

Bence, bunun uygulanmamış olmasının nedeni, JavaScript'in bir nesnenin özelliklerine köşeli parantezler kullanarak erişime izin vermesi ve bunun bazı belirsizlikler yaratmasıdır. Örneğin, eğer data.myProperty var olan bir özellikse ve data['myProperty'] çağrılırsa, bunun myProperty özelliğini mi döndürmesi yoksa 'myProperty' stringinin indeks aşırı yüklemesine mi geçirilmesi gerektiğine karar vermek zor olurdu.

Orijinal Cevap

Sonucunu değiştirmek mümkün değildir:

var a = [];

İnsanlara bu davranışı değiştirmelerine izin verilirse ortaya çıkabilecek sorunları hayal edin. Kütüphane A bunu bir şekilde tanımlayabilir ve sonra Kütüphane B bunu kendi davranışıyla değiştirebilir... bu da Kütüphane B'nin artık Kütüphane A'nın [] davranışını kullanması anlamına gelir.

Array prototipine yöntemler ekleyebilirsiniz:

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

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

Sonra kullan:

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

Ancak, bunu yapmak şiddetle önerilmez! Sahip olmadığınız nesneleri değiştirmemelisiniz çünkü bu öngörülemeyen sorunlara yol açabilir. Bunu yapmamanın sebebi, [] davranışını değiştirmenin sorunlara yol açacağı sebebe benzer:

  1. Kütüphane A bir log yöntemi tanımlar.
  2. Kütüphane B, farklı çalışan bir log yöntemi tanımlar.
  3. Artık Library A için log yöntemi beklendiği gibi çalışmayacak çünkü Library B'nin yöntemini kullanıyor.

Öneri

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

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

    // implement methods for Array here

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

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

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

İlgili makaleler