Typescript 如何注释类到工厂函数转换器

Typescript 如何注释类到工厂函数转换器,typescript,generics,Typescript,Generics,我试图注释一个函数,它接受一个类并返回一个工厂函数,该工厂函数返回该类的实例。(基本上,它不再需要新建) 以下是我的想法: const noNew = <T, U = new (...a: any[]) => T>(clazz: U): { (...b: any[]): T } => { return (...args: any[]) => { return new clazz(...args); }; } const noNew=

我试图注释一个函数,它接受一个类并返回一个工厂函数,该工厂函数返回该类的实例。(基本上,它不再需要
新建

以下是我的想法:

const noNew = <T, U = new (...a: any[]) => T>(clazz: U): { (...b: any[]): T } => {
    return (...args: any[]) => {
        return new clazz(...args);
    };
}
const noNew=T>(clazz:U):{(…b:any[]):T}=>{
return(…args:any[])=>{
返回新的clazz(…args);
};
}
这不起作用至少有两个原因:

  • 我得到一个“不能对类型缺少调用或构造签名的表达式使用'new'”。
    返回new clazz(…args)时出错
  • 我没有对构造函数参数参数进行任何类型完成或类型检查

  • 我如何重写它而不产生错误并使参数类型感知?

    第一个问题很容易解决,您实际上不需要
    U
    您只需使用
    clazz:new(…a:any[])=>t

    第二个问题有点复杂,没有完美的解决方案。要获取参数类型,您需要定义具有多个签名的函数,每个签名对应于构造函数参数列表的长度:

    function noNew<T>(clazz: new () => T): { (): T } 
    function noNew<T, T1>(clazz: new (arg1: T1) => T): { (arg1: T1): T } 
    function noNew<T, T1, T2>(clazz: new (arg1: T1, arg2: T2) => T): { (arg1: T1, arg2: T2): T } 
    function noNew<T, T1, T2, T3>(clazz: new (arg1: T1, arg2: T2, arg3: T3) => T): { (arg1: T1, arg2: T2, arg3: T3): T } 
    function noNew<T>(clazz: new (...a: any[]) => T): { (...b: any[]): T } {
        return (...args: any[]) => {
            return new clazz(...args);
        };
    }
    
    它可以工作,除非您有可选参数,然后
    noNew
    返回一个只保留所需参数并删除可选参数的函数

    class BB {
        constructor (a?: string){}
    }
    let b = noNew(BB)(); // No arguments
    
    class BB {
        constructor (a?: string){}
    }
    let b = noNew(BB)(); // No arguments