我有一個標記類副本的功能。它接受一個類并回傳我指定的多個類的副本。但問題不在于函式,而在于它的簽名。要創建新類,我需要一個函式new并將其連接起來extends { new(): T }。我需要它回傳一個類陣列及其型別,但它回傳了(new () => typeof Rectangle)[],我不知道問題出在哪里。這是代碼。
class Rectangle {
w!: number;
h!: number;
}
class Circle {
radius!: number;
}
function stampFigures<T extends { new (): T } >(someClass: T, count: number): T[] {
let a = []
for (let i = 0; i < count; i )
a.push(new someClass());
return a;
}
let a: Rectangle[] = stampFigures(Rectangle, 10); //here i need Rectangle[] but i got (new () => typeof Rectangle)[]
let b: Circle[] = stampFigures(Circle, 20) //and here
console.log(a)
console.log(b)
uj5u.com熱心網友回復:
您需要推斷類的實體型別:
class Rectangle {
w!: number;
h!: number;
}
class Circle {
radius!: number;
}
function stampFigures<
Klass extends { new(): any }
>(someClass: Klass, count: number) {
let a: InstanceType<Klass>[] = []
for (let i = 0; i < count; i )
a.push(new someClass());
return a;
}
let a = stampFigures(Rectangle, 10); // Rectangle[]
let b = stampFigures(Circle, 20) // Circle[]
console.log(a)
console.log(b)
操場
你也可以查看我的文章
如果您對最安全的解決方案感興趣,您可以創建基類并使用tag屬性擴展您的類。換句話說,歧視它。
class Shape {
tag: string = ''
}
class Rectangle extends Shape {
tag = 'Rectangle'
w!: number;
h!: number;
}
class Circle extends Shape {
tag = 'Circle'
radius!: number;
}
function stampFigures<
Klass extends typeof Shape,
Instance extends InstanceType<Klass>
>(someClass: Klass & (new () => Instance), count: number) {
let a = []
for (let i = 0; i < count; i )
a.push(new someClass());
return a;
}
let a = stampFigures(Rectangle, 10); // Rectangle[]
let b = stampFigures(Circle, 20) // Circle[]
console.log(a)
console.log(b)
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/427849.html
下一篇:協議中的Swift泛型
