Generics Typescript调用泛型类型的静态方法

Generics Typescript调用泛型类型的静态方法,generics,typescript,service,static,Generics,Typescript,Service,Static,我有一个服务,我想用它从JSON返回一个指定类型的对象 我有一个类MyClass,它实现了一个静态类,定义了一个FromJSON静态方法 export interface InterfaceMyClass { static FromJSON(json: any): any; } export class MyClass implements InterfaceMyClass { constructor(){} FromJSON(json: any): MyClass

我有一个服务,我想用它从JSON返回一个指定类型的对象

我有一个类
MyClass
,它实现了一个静态类,定义了一个
FromJSON
静态方法

export interface InterfaceMyClass {
    static FromJSON(json: any): any;
}

export class MyClass implements InterfaceMyClass {

    constructor(){}

    FromJSON(json: any): MyClass {
        let instance = MyClass.create(MyClass.prototype);
        Object.assign(instance, json);
        // Some other code specific to MyClass
        return instance;
    }
}
我不知道如何调用我在服务中传入参数的泛型类的静态方法。 我的服务如下所示:

export class MyService<T extends InterfaceMyClass> {
    getObject() {
        let json = getExternalJson(...);
        return T.FromJSON(json); // <-- How to call static method FromJSON from T class ?
    }
}
有几件事:

(1) 接口不能有静态声明,例如:

interface MyInterface {
    static myMethod(); // Error: 'static' modifier cannot appear on a type member
}
class MyClass<T extends string> {
    private member: T;

    constructor() {
        this.member = new T(); // Error: Cannot find name 'T'
    }
}
()

在typescript中解决此问题的方法是定义一个生成器/构造函数接口:

interface MyInterface {}

interface MyInterfaceBuilder {
    new (): MyInterface;
    myMethod();
}
(2) 泛型约束仅在编译时可用,但编译器会删除它们,因为javascript不支持它,例如:

interface MyInterface {
    static myMethod(); // Error: 'static' modifier cannot appear on a type member
}
class MyClass<T extends string> {
    private member: T;

    constructor() {
        this.member = new T(); // Error: Cannot find name 'T'
    }
}
()

当查看js输出时,很清楚为什么编译器抛出
找不到名称“T”
错误,因为
T
找不到

要解决所有这些问题,这里有一个解决方案:

interface IMyClass {}

interface IMyClassBuilder<T extends IMyClass> {
    new (): T;
    FromJSON(json: any): any;
}

class MyClass implements IMyClass {
    static FromJSON(json: any) {
        return "";
    }
}

class MyService<T extends IMyClass> {
    private classToCreate: IMyClassBuilder<T>;

    constructor(classToCreate: IMyClassBuilder<T>) {
        this.classToCreate = classToCreate;
    }

    getObject(): T {
        let json = getExternalJson(...);
        return this.classToCreate.FromJSON(json);
    }
}

let service = new MyService(MyClass);
let myObject = service.getObject();
接口IMyClass{}
接口IMyClassBuilder{
新的():T;
FromJSON(json:any):any;
}
类MyClass实现IMyClass{
静态FromJSON(json:any){
返回“”;
}
}
类MyService{
创建私有类:IMyClassBuilder;
构造函数(classToCreate:IMyClassBuilder){
this.classToCreate=classToCreate;
}
getObject():T{
让json=getExternalJson(…);
返回this.classToCreate.FromJSON(json);
}
}
let service=new MyService(MyClass);
让myObject=service.getObject();
()

interface IMyClass {}

interface IMyClassBuilder<T extends IMyClass> {
    new (): T;
    FromJSON(json: any): any;
}

class MyClass implements IMyClass {
    static FromJSON(json: any) {
        return "";
    }
}

class MyService<T extends IMyClass> {
    private classToCreate: IMyClassBuilder<T>;

    constructor(classToCreate: IMyClassBuilder<T>) {
        this.classToCreate = classToCreate;
    }

    getObject(): T {
        let json = getExternalJson(...);
        return this.classToCreate.FromJSON(json);
    }
}

let service = new MyService(MyClass);
let myObject = service.getObject();