Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 键入基于参数应用mixin的工厂方法的返回_Typescript_Generics_Factory Pattern - Fatal编程技术网

Typescript 键入基于参数应用mixin的工厂方法的返回

Typescript 键入基于参数应用mixin的工厂方法的返回,typescript,generics,factory-pattern,Typescript,Generics,Factory Pattern,我试图在TypeScript中创建一个工厂方法,该方法基于工厂方法的一个参数创建一个应用了一些mixin的类(实例) 这是从普通JavaScript移植的代码。从功能上讲,它工作得很好,只是TypeScript不能“识别”正在发生的动态内容,因此它不知道工厂方法的returnType 这是我目前拥有的代码,我试图让TypeScript以某种方式了解ServiceFactory方法的returnType,它至少始终是BaseModel,但取决于operations参数的值,还通过ICreatabl

我试图在TypeScript中创建一个工厂方法,该方法基于工厂方法的一个参数创建一个应用了一些mixin的类(实例)

这是从普通JavaScript移植的代码。从功能上讲,它工作得很好,只是TypeScript不能“识别”正在发生的动态内容,因此它不知道工厂方法的returnType

这是我目前拥有的代码,我试图让TypeScript以某种方式了解ServiceFactory方法的returnType,它至少始终是BaseModel,但取决于operations参数的值,还通过ICreatable等接口进行了扩展


const OPERATIONS=Object.freeze({
/**仅HTTP获得支持(方法:all和show)*/
默认值:0,
/**HTTP POST(方法:创建*/
创建:1,,
/**HTTP修补程序(方法:更新*/
更新:2,
/**HTTP POST和修补程序(方法:创建和更新*/
创建和更新:3,
/**HTTP PUT(方法:替换*/
可替换:4,
/**HTTP删除(方法:删除*/
删除:8,
/**HTTP GET、POST、PUT、PATCH和DELETE(方法:all、show、create、replace、update和DELETE)*/
全体:15,
});
类型构造函数=new(…参数:any[])=>T;
导出接口ICreatable{
创建(requestContext:object,body:object,options:object):承诺
}
导出类BaseModel{}
export const createable=(Sup:T)=>类扩展Sup实现ICreatable{
异步创建():承诺{
返回。。。;
}
};
导出函数ServiceFactory(名称:string,operations=operations.DEFAULT):BaseModel{
let Clazz={[name]:类扩展BaseModel{}[name];//https://stackoverflow.com/questions/33605775/es6-dynamic-class-names/33611096
//if(操作和操作.更新){
//Clazz=可更新(Clazz);
//}
if(operations&operations.CREATE){
Clazz=可创建(Clazz);
}
//if(操作和操作.删除){
//Clazz=可删除(Clazz);
//}
//if(操作和操作。可更换){
//Clazz=可更换(Clazz);
//}
返回新Clazz();
}
当我调用下面的代码时,TypeScript应该知道someNameClassInstance有一个名为“create”的方法

const someNameClassInstance=ServiceFactory('someName',OPERATIONS.CREATE)
someNameClassInstance//自动完成应产生“create”
``

我不知道您的用例以及对动态类的需求,但是使用泛型快速解决方案怎么样:

export function ServiceFactory<T extends BaseModel>(name: string, operations = OPERATIONS.DEFAULT): T {
}
导出函数ServiceFactory(名称:字符串,操作=操作。默认值):T{ }
typemytype={create:(oneArg:string,otherArg:number)=>boolean}
const someNameClassInstance=ServiceFactory('someName',OPERATIONS.CREATE)
someNameClassInstance//生成代码洞察创建
对于一个更坚实的解决方案,我认为重构工厂本身是一条路要走

type MyType = {create: (oneArg: string, otherArg: number) => boolean}

const someNameClassInstance = ServiceFactory<MyType>('someName', OPERATIONS.CREATE)
someNameClassInstance // yields code insight create