【问题标题】:TypeScript generic function creating new instance with parameterTypeScript 泛型函数使用参数创建新实例
【发布时间】:2019-12-17 08:48:03
【问题描述】:

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

我为此创建了一个通用函数,而不是每次都使用 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;
}

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

【问题讨论】:

    标签: angular typescript generics interface


    【解决方案1】:

    类型在运行时不存在,因此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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-09
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      相关资源
      最近更新 更多