Sorunun Tarihi
Birçok kesin tipli dil (C++, C#, Python) operatörler için açık aşırı yüklemeleri sınıf düzeyinde tanımlamaya izin verir (örneğin, +, -, *, ==). TypeScript'te, JavaScript gibi, tarihsel ve mimari nedenlerden dolayı operatör aşırı yüklemesi dildir düzeyinde yoktur.
Sorun
Karmaşık türlere (örneğin, karmaşık sayılar veya vektörler) aritmetik ya da diğer işlemler için destek eklemek gerektiğinde, standart operatörleri değiştirmek mümkün değildir. Bu, ifade gücünü kısıtlar ve geçici kalıplar icat etmeyi gerektirir.
Çözüm
TypeScript'te, operatör aşırı yüklemesi özel adlandırılmış yöntemler aracılığıyla taklit edilir (örneğin, add, equals, multiply). Bu yöntemlerle donatılan bir sınıf oluşturarak, Type-safe davranış sağlayabiliriz, ancak sözdizimi C++'taki kadar sade görünmemektedir.
Kod örneği:
class Vector { constructor(public x: number, public y: number) {} add(other: Vector): Vector { return new Vector(this.x + other.x, this.y + other.y); } equals(other: Vector): boolean { return this.x === other.x && this.y === other.y; } } const a = new Vector(1, 2); const b = new Vector(3, 4); const c = a.add(b); // Vector { x: 4, y: 6 } const eq = a.equals(b); // false
Anahtar özellikler:
TypeScript'te kendi sınıfınız için "==" veya "+" operatörünün davranışını yeniden tanımlamak mümkün mü?
Hayır, JavaScript (ve TypeScript) kullanıcı nesneleri için standart operatörleri doğrudan aşırı yüklemeye izin vermez. Operatörler Object, Number ve diğer ilkel türler için standartlara sıkı sıkıya bağlıdır. Böyle bir "yeni tanım" çabası yanlış ya da beklenmedik davranışa yol açar veya hiç çalışmaz.
Operatörler üzerinde dolaylı etki için valueOf veya toString kullanmak mümkün mü?
Bazı durumlarda valueOf kullanılabilir (örneğin, sayı olarak kısa bir dönüştürme için), ancak yalnızca nesnenin ilkel değerine erişen operatörler için.
class Box { constructor(private v: number) {} valueOf() { return this.v; } } const a = new Box(10); console.log(a + 5); // 15 — çalışıyor, ancak karmaşık nesneler için sezgisel değil.
Ancak karmaşık yapılar ve mantıksal operatörler için açık yöntemler kullanmak mantıklıdır.
TypeScript veya ECMAScript'e operator overloading eklenmesi için herhangi bir plan var mı?
Şu anda kabul edilmiş bir plan yok: Operatör aşırı yüklemesi prensipte JS tasarımına aykırıdır, çünkü standart nesnelerin davranışını önemli ölçüde değiştirebilir ve kodun istikrarsızlaşmasına yol açabilir.
Bir geliştirici, matematiksel ifadelerde yer değiştirme yapmak için valueOf/toString'i uyguladığı bir Matrix sınıfı oluşturur. Sayılarla veya dizelerle toplama yapıldığında, öngörülemeyen sonuçlar elde edilir ve kesin tiplenme mümkün değildir.
Artılar:
Eksiler:
Vector sınıfı, giriş ve çıkış parametrelerinin belirgin tiplenmesiyle birlikte add, multiply, equals yöntemlerini uygular. Sınıfın müşterileri, ilgili yöntemleri açık bir şekilde kullanır, anlam kaybolmaz ve keskin tiplenme sağlanır.
Artılar:
Eksiler: