繁体   English   中英

根据在 typescript 中作为参数接收的 class 定义方法返回类型

[英]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, {});

请参阅下图以更好地说明:

vscode 类型

另一张图来说明:

在此处输入图像描述

首先,您可以创建一个类型以请求一个定义了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM