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!