Typescript 联合类型和;咖喱部分应用程序风格API

Typescript 联合类型和;咖喱部分应用程序风格API,typescript,Typescript,我有以下界面: interface IFactory<T> extends Function { (...args: any[]): (((...args: any[]) => T)|T); } 接口IFactory扩展了功能{ (…args:any[]):(((…args:any[])=>T)T; } 以下代码段导致错误: ts]类型“(…args:any[])=>IKatana)| IKatana”不可分配给类型“IKatana”。类型“(…args:any[]

我有以下界面:

interface IFactory<T> extends Function {
    (...args: any[]): (((...args: any[]) => T)|T);
}
接口IFactory扩展了功能{
(…args:any[]):(((…args:any[])=>T)T;
}
以下代码段导致错误:

ts]类型“(…args:any[])=>IKatana)| IKatana”不可分配给类型“IKatana”。类型“(…args:any[])=>IKatana”不可分配给类型“IKatana”。类型“(…args:any[])=>IKatana”中缺少属性“hit”。 (不动产)用户定义工厂的Ninja。\u katana:IKatana

@injectable()
类NinjaWithUserDefinedFactory在Inja中实现{
卡塔纳:伊卡塔纳;
二等兵:伊舒里肯,;
公共构造函数(
@注入(“IFactory”)Katana工厂:IFactory,
@注射(“IShuriken”)shuriken:IShuriken
) {
这是。_katana=katanaFactory();//错误!
这个;
}
公共斗争(){返回此。_katana.hit();};
public selk(){返回此项。_shuriken.throw();};
}
有时,可以使用配置多次调用工厂。这也造成了一些问题:

无法调用其类型缺少调用签名的表达式

类引擎{
构造函数(类型:string,cc:number){}
}
让engineFactory:IFactory=(类型:字符串)=>(cc:number)=>{
返回新发动机(型号,cc);
};
让柴油发动机=发动机系数(“柴油机”);
让柴油发动机300cc=柴油发动机(300);//错误!
让柴油发动机320cc=柴油发动机(320);//错误!
关于如何克服这个问题有什么想法吗

更新
typescript团队正在研究解决此问题的方法。

在以下签名中,您有:

interface IFactory<T> extends Function {
    (...args: any[]): (((...args: any[]) => T)|T);
}
修理 从上面的分析中可以清楚地看出,您需要预先指定呼叫数。您可以将其简化为2呼叫工厂:

interface IFactory<T,C> {
    (type:string): (configuration:C) => T;
}

class Engine {
    constructor(type: string, cc: number) {}
}


let engineFactory: IFactory<Engine,number> = (type: string) => (cc: number) => {
    return new Engine(type, cc);
};

let dieselEngine = engineFactory("diesel");
let dieselEngine300cc = dieselEngine(300); // Okay!
let dieselEngine320cc = dieselEngine(320); // Okay!
接口IFactory{
(类型:字符串):(配置:C)=>T;
}
类引擎{
构造函数(类型:string,cc:number){}
}
让engineFactory:IFactory=(类型:字符串)=>(cc:number)=>{
返回新发动机(型号,cc);
};
让柴油发动机=发动机系数(“柴油机”);
让柴油发动机300cc=柴油发动机(300);//可以
让柴油发动机320cc=柴油发动机(320);//可以
interface IFactory<T> extends Function {
    (...args: any[]): (((...args: any[]) => T)|T);
}
interface IFactory<T> {
    (...args: any[]): (IFactory<T>|T);
}
engineFactory("diesel")(300); // Error
interface IFactory<T,C> {
    (type:string): (configuration:C) => T;
}

class Engine {
    constructor(type: string, cc: number) {}
}


let engineFactory: IFactory<Engine,number> = (type: string) => (cc: number) => {
    return new Engine(type, cc);
};

let dieselEngine = engineFactory("diesel");
let dieselEngine300cc = dieselEngine(300); // Okay!
let dieselEngine320cc = dieselEngine(320); // Okay!