首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >typescript中的CollectionResult<T>

typescript中的CollectionResult<T>
EN

Stack Overflow用户
提问于 2019-05-27 21:40:16
回答 1查看 47关注 0票数 2

我正在尝试为从服务器获取响应的代理服务创建一个泛型类。当我继续实现这个类时,我遇到了一个问题,调用泛型类中的方法。如何从泛型类型中声明的in (Item)中调用静态方法?

代码语言:javascript
运行
复制
export class CollectionResult<T> implements ICollectionResult<T> {
    items: Array<T>;

    constructor(data?: T) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(data?: any) {
        if (data) {
            Object.assign(this, data);
            this.items = [];
            for (let item of data.items) {
                this.items.push(T//NOTE: Error here//.fromJS(item));
            }
        }
    }

     fromJS(data: any): CollectionResult<T> {
        let result = new CollectionResult<T>();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        Object.assign(data, this);
        if (this.items && this.items.constructor === Array) {
            data["items"] = [];
            for (let item of this.items) {
                data["items"].push(item);
            }
        }
        return data;
    }
}

export interface ICollectionResult<T> {
    items: Array<T>;
}

//传入CollectionResult的泛型类

代码语言:javascript
运行
复制
export class ProgramDto implements 
IProgramDto {
    year: number;
    month: number;
    accounts: number;

    constructor(data?: ProgramDto) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(data?: any) {
        if (data) {
            Object.assign(this, data);
        }
    }

    static fromJS(data: any): ProgramDto {
        let result = new ProgramDto();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        Object.assign(data, this);

        return data;
    }
}

export interface IProgramDto {
    year: number;
    month: number;
    accounts: number;
}

//代理方法中的用法

代码语言:javascript
运行
复制
Get(): Observable<CollectionResult<ProgramDto >> {
        let url = `${this.baseUrl}/Api/Controller/Method`;
        url = url.replace(/[?&]$/, "");
        let options = this.getOptions();
        return this.sendRequestWithResponse(url, options, CollectionResult<ProgramDto>.fromJS, new CollectionResult<ProgramDto>());
    }
EN

回答 1

Stack Overflow用户

发布于 2019-05-27 21:49:55

不能访问泛型类型参数的成员。类型参数在编译过程中被擦除,因此除了类型检查之外,您不能依赖它们进行任何其他操作。

您可以将类作为参数传入,并将其约束为具有fromJs方法:

代码语言:javascript
运行
复制
type CollectionResultDataClass<T> = {
    new(...a: any[]): T
    fromJs(o: any): T
}

export class CollectionResult<T> implements ICollectionResult<T> {
    items: Array<T>;

    constructor(private cls: CollectionResultDataClass<T>, data?: T) {
        // ...
    }

    init(data?: any) {
        if (data) {
            Object.assign(this, data);
            this.items = [];
            for (let item of data.items) {
                this.items.push(this.cls.fromJs(item));
            }
        }
    }

    fromJS(data: any): CollectionResult<T> {
        let result = new CollectionResult<T>(this.cls);
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        //..
    }
}

//Usage
class MyDataClass {
    static fromJs(o: any) {
        return Object.assign(new MyDataClass(), o);
    }
}

new CollectionResult(MyDataClass, new MyDataClass());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56327217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档