TypeScript: Aynı aşırı yükleme sözdizimini destekleyen sınıf yapıcısına, aşırı yüklenmiş fonksiyonun parametrelerini ilet
Aşırı yüklenmiş bir yapıcıya sahip bir sınıfım var. Ayrıca bu sınıf için sınıfın bir örneğini döndüren bir Fabrika fonksiyonum var. Bu fabrika fonksiyonu da aşırı yüklenmiş durumda ve fabrika fonksiyonunun tüm aşırı yüklenmiş sözdizimleri, aşırı yüklenmiş yapıcı sözdizimleri ile eşleşiyor.
Şimdi, fabrika fonksiyonunun çağrıldığı argümanları, argümanların türlerini çıkarmakla ilgili mantığı fabrika fonksiyonu ile yapıcı arasında çoğaltmak zorunda kalmadan ve ardından fabrika fonksiyonunda farklı yapıcı sözdizimleri arasında geçiş yapıp onları özel olarak çağırmak zorunda kalmadan, yapıcı çağrı üzerine 'uygulamanın' bir yolunu arıyorum.
Yukarıdakileri açıklamak için bazı kodlar:
class X {
constructor()
constructor(noOfRows: number, noOfCols: number)
constructor(noOfRows: number, colNames: string[])
constructor(????) {
//Logic here deduct based on the arguments send into the call which version of the constructor is called and properly initialize the X instance
}
function createX(): X
function createX(noOfRows: number, noOfCols: number): X
function createX(noOfRows: number, colNames: string[]): X
function createX(????): X {
//Here I rather not touch the arguments at all, but just forward them into the constructor call
return new X(????)
}
Aşağıdaki gibi bir rest/spread yaklaşımı da dahil olmak üzere birkaç şeyi denedim, ama TypeScript buna sıcak bakmıyor:
function createX(...args: any[]): X {
return new X(...args)
}
Bunu (doğru bir şekilde) nasıl yapacağım konusunda herhangi bir öneriniz var mı?
Teşekkürler,
Paul
Cevap #1
Bunu yapabilirsin:
class X {
constructor();
constructor(noOfRows: number, noOfCols: number);
constructor(noOfRows: number, colNames: string[]);
constructor(...args: any[]) {
// ...
}
}
interface XConstructor {
new (...args: any[]): X;
}
function createX(): X;
function createX(noOfRows: number, noOfCols: number): X;
function createX(noOfRows: number, colNames: string[]): X;
function createX(...args: any[]): X {
return new (X as XConstructor)(...args);
}
(oyun alanında kod)
XConstructor öğesini dışa aktarmadan.
Bir diğer seçenek:
class X {
constructor();
constructor(noOfRows: number, noOfCols: number);
constructor(noOfRows: number, colNames: string[]);
constructor(a?: any, b?: any) {
// ...
}
}
function createX(): X;
function createX(noOfRows: number, noOfCols: number): X;
function createX(noOfRows: number, colNames: string[]): X;
function createX(a?: any, b?: any): X {
return new X(a, b);
}
(oyun alanında kod)
