TypeScript泛型函数使用参数创建新实例

时间:2019-08-09 15:15:49

标签: angular typescript generics interface

我有很多扩展接口的类。这些类可以具有彼此包含对象的数组。因此,例如:一所学校可以包含许多学生,但两者都实现相同的界面。

我为此创建了一个泛型函数,而不是每次都使用forEach循环并将其推入数组。这个新的通用函数应该只需一行就可以完成。

export class School implements MyInterface {
    public studens: Student[] = [];
    public constructor(data_from_backend) {
        this.students = mapDataToModelArrayFunction<Student>(data_from_backend.students);
    }
}

export class Student implements MyInterface {
    public name: string;
    public constructor(data_from_backend) {
        this.name = data_from_backend.name;
    }
}

export function mapDataToModelArrayFunction<T>(array): T[] {
    const listToReturn: T[] = [];
    if (Array.isArray(array)) {
        array.forEach(item => {
            listToReturn.push(new T(obj));
        });
    }
    return listToReturn;
}

但是由于T,TypeScript / Angular给我一个错误。不允许我创建T的实例。那我该怎么做?

1 个答案:

答案 0 :(得分:2)

类型在运行时不存在,因此T被删除,表达式new T(item)变成new (item),这实际上没有意义。换句话说,您不能在表达式中使用类型。

解决方案是将构造函数(即类)传入映射函数:

interface MyInterface { }
export class School implements MyInterface {
    public students: Student[] = [];
    public constructor(data_from_backend: any) {
        this.students = mapDataToModelArrayFunction(Student, data_from_backend.students);
    }
}

export class Student implements MyInterface {
    public name: string;
    public constructor(data_from_backend: any) {
        this.name = data_from_backend.name;
    }
}

export function mapDataToModelArrayFunction<T>(cls: new (data: any) => T, array: any[]): T[] {
    const listToReturn: T[] = [];
    if (Array.isArray(array)) {
        array.forEach(item => {
            listToReturn.push(new cls(item));
        });
    }
    return listToReturn;
}

Play