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:
- Kütüphane A bir
logyöntemi tanımlar. - Kütüphane B, farklı çalışan bir
logyöntemi tanımlar. - Artık Library A için
logyö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));
}
}
