我有很多扩展接口的类。这些类可以具有彼此包含对象的数组。因此,例如:一所学校可以包含许多学生,但两者都实现相同的界面。
我为此创建了一个泛型函数,而不是每次都使用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的实例。那我该怎么做?
答案 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;
}