调用泛型类型的静态函数

时间:2018-05-02 20:12:20

标签: typescript

想象一下对泛型类型进行操作的函数:

protected foo<T>(abc: any): T{
    //[...]
    let x : T = T.fromString(xyz);
    //[...]
}

fromString(xyz: string)是一个静态函数,它以某种方式将字符串转换为T

当然它现在不起作用,因为T类型不是值。但是,如果我知道将要代替T的每个班级都实施fromString方法,我该如何才能正常工作?

我考虑过创建界面:

export interface DtoSchema {
    fromString<T>(data:any) : T;
}

在课堂上实施:

export class ColumnDTO implements DtoSchema {
    //[...]
    static fromString<T extends DtoSchema>(data: any): T {
        data = typeof data === 'object' ? data : {};
        let result = new ColumnDTO();
        result.init(data);
        return result;
    }
}

我已经完成了这一点,但我不能让它发挥作用。这是我遇到的最后一个错误:

  

类型'ColumnDTO'不能分配给'T'

我是否正确地尝试这样做?你会如何解决它?

1 个答案:

答案 0 :(得分:1)

这简单地回答了你问的问题。

  

Type 'ColumnDTO' is not assignable to type 'T'

显示错误的简化代码:

interface DtoSchema { }
export class ColumnDTO {
    static fromString<T extends DtoSchema>(data: any): T {
        data = typeof data === 'object' ? data : {};
        let result = new ColumnDTO();
        result.init(data);
        return result; // ERROR: Type 'ColumnDTO' is not assignable to type 'T'
    }
    init(data: any) {
    }
}

修复

修复返回类型注释以匹配您返回的内容:

interface DtoSchema { } 
export class ColumnDTO {
    static fromString<T extends DtoSchema>(data: any): ColumnDTO { // FIX!
        data = typeof data === 'object' ? data : {};
        let result = new ColumnDTO();
        result.init(data);
        return result; // No error!
    }
    init(data: any) {
    }
}