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 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