type为参数的typescript方法

时间:2018-04-05 13:51:15

标签: class typescript

鉴于此课程的等级

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[];
}

3 个答案:

答案 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);

这是一个有用的链接

Working demo

答案 2 :(得分:0)

export class Container<T extends typeof A> {
    public klazzes: T[];
}

enter image description here

不同
export class Container<T extends typeof A> {
    public klazzes: A[];
}

将数组键入特定类型&#39; A&#39;破坏了泛型的目的。所以,我想你会想要使用模板类型&#39; T&#39;

enter image description here