import { SelectQueryBuilder } from 'typeorm'; type Unmapped = { [name: string]: Function | any; }; type RemapType = { [K in keyof T & string as RemoveScope]: T[K] extends (query: ProxyQuery, ...filter: infer P) => ProxyQuery ? (...filter: P) => ProxyQuery : T[K]; }; // type ActionType = (...args: Parameters) => { type: string; payload: ReturnType }; type RemoveScope = S extends `scope${infer Tail}` ? `${Tail}` : S; export type ProxyQuery = RemapType & SelectQueryBuilder; export const createProxy = (Model: new () => T, queryBuilder: SelectQueryBuilder) => { const modelObj: any = new Model(); const queryBuilderObj = queryBuilder; const proxyObject = new Proxy(queryBuilderObj, { get: (target, prop: string, receiver) => { const funct = 'scope' + prop; if (funct in modelObj) { return (...val: any[]) => modelObj[funct](proxyObject, ...val); } return Reflect.get(target, prop, receiver); }, }); return (proxyObject as any) as ProxyQuery; };