首页 > 解决方案 > 调用泛型类型的静态函数

问题描述

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

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”

我是否试图正确地做到这一点?你会如何解决它?

标签: typescript

解决方案


这只是回答了您提出的问题。

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) {
    }
}

推荐阅读