[英]Define method return type according class received as parameter in typescript
是否可以根据参数接收到的class的static属性强制返回function的返回类型?
在下面的代码中,我希望变量 foo 是 Date 类型,等于作为参数接收的 class 的returnType
属性,但我不知道该怎么做,或者是否可能。
function register<T extends { new(...n: any[]): {} }>(constructor: T, ...args: ConstructorParameters<T>) {
// the error \\
return <constructor.returnType><unknown>new constructor(...args);
}
class Clazz {
static returnType: Date
constructor(p1: string, p2: number, p3: object) { }
}
let foo = register(Clazz, "", 1, {});
请参阅下图以更好地说明:
另一张图来说明:
首先,您可以创建一个类型以请求一个定义了returnType
(静态属性)的 class:
type ClassWithReturnType = { new(...args: any[]): any; returnType: any; };
那么你知道你可以通过推理提取returnType
,如下所示:
type ClassReturnType<T extends ClassWithReturnType> = T['returnType'] extends infer R ? R : never;
此时你只需要将 function 声明改为:
function register<T extends ClassWithReturnType>(constructor: T, ...args: ConstructorParameters<T>): ClassReturnType<T> {
return (new constructor(...args));
}
但是,对我来说听起来很奇怪的是,您正在调用new constructor()
并期待与T
不同的returnType
。 这是不可能的,因为构造函数返回 class T 的实例。也许您想将此用于其他目的/static 方法,但我希望这能回答您的问题。
完整代码是: 游乐场链接
type ClassWithReturnType = { new(...args: any[]): any; returnType: any; };
type ClassReturnType<T extends ClassWithReturnType> = T['returnType'] extends infer R ? R : never;
function register<T extends ClassWithReturnType>(constructor: T, ...args: ConstructorParameters<T>): ClassReturnType<T> {
return (new constructor(...args));
}
class Clazz {
static returnType: Date;
constructor(p1: string, p2: number, p3: object) { }
}
let foo = register(Clazz, "", 1, {});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.