如何在 Typescript 中泛指具有静态构造函数的类型

How to generically refer to a type that has a static constructor function in Typescript

我有一些生成的代码 (gRPC) 生成各种 classes,每个都有一个静态构造函数,如 static create(): Foo。这些 classes 中的每一个都有自己的静态构造函数,它明确地 returns 本身(A 的函数 returns 一个 A 对象等)。

我正在尝试创建一个在编译时捕获此信息的通用接口,然后编写一个通用函数来引用每个 class,然后传递一个接收实例的处理程序回调class.

// ----- generated code starts -----
class A {
    name = 'AAA';

    static create(): A {
        return new A();
    }
}

class B {
    age = 32;

    static create(): B {
        return new B();
    }
}

class C {
    location = 'New York';

    static create(): C {
        return new C();
    }
}


// ----- generated code ends -----

/**
 * Represents a class that can be constructed by calling a static method
 */
interface StaticallyConstructable<OBJ> {
    create(): OBJ;
}

function registerHandler<CLS extends StaticallyConstructable<CLS>>(ObjClass: CLS, handler: (obj: CLS) => void) {
    const obj = ObjClass.create();
    handler(obj);
}

registerHandler(C, (obj: C) => {
    obj.location
});

registerHandler 函数本身编译得很好,但是当我用像 C 这样的实际 class 和接收 C 的处理程序调用它时,我得到了以下错误:

Property 'location' is missing in type 'StaticallyConstructable<C>' but required in type 'C'.

编辑:TS playground link

CLS应该表示实例类型,所以ObjClass应该是StaticallyConstructable<CLS>

类型

function registerHandler<CLS>(ObjClass: StaticallyConstructable<CLS>, handler: (obj: CLS) => void) {
    const obj = ObjClass.create();
    handler(obj);
}

registerHandler(C, (obj: C) => {
    obj.location
});

Playground Link