如何在 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'.
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
});
我有一些生成的代码 (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'.
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
});