鉴于此课程的等级
export class A {
static m() { return 'a'};
}
export class B extends A {
static m() { return 'b'};
}
export class C extends A {
static m() { return 'c'};
}
我需要一个方法来获取扩展A
的类(非实例)并在数组的每个元素上调用m()
:
function looper(classes: A[]) {
classes.forEach(c => c.m());
}
这需要一个A或其子类的实例数组。
我怎样才能有一个方法作为扩展A的参数类?
@Oscar Paz指出的泛型
编辑1
此外,looper的输入需要存储在对象的属性中:
export class Container {
public klazzes: A[];
}
我
答案 0 :(得分:1)
好吧,使用泛型:
function callM<T extends typeof A>(arr: T[]): void {
arr.forEach(t => t.m());
}
现在你可以做到:
callM([A, B, C]); // OK
callM([A, B, string]); // Error
如果要存储值:
class Container {
public klazzes: (typeof A)[];
}
const cont: Container = new Container();
callM(cont.klazzes);
答案 1 :(得分:0)
不确定这是否是您正在寻找的东西 - 除了@Oscar建议您可以创建一个通用类来将数组存储在T[]
类型的属性中,如下所示。
export class A {
static m() { return 'a'};
}
export class B extends A {
static m() { return 'b'};
}
export class C extends A {
static m() { return 'c'};
}
export class Container<T extends typeof A> {
public klazzes: T[];
constructor() {
this.klazzes = [];
}
public callM<T extends typeof A>(arr: T[]): void {
arr.forEach(t =>
console.log(t.m())
);
}
}
// usage
let cont = new Container();
cont.klazzes = [A, B, C];
cont.callM(cont.klazzes);
这是一个有用的链接
答案 2 :(得分:0)