const obj = { extend: (p: { property: string; methods: { name: string; call: string; params: number }[]; }) => { obj[p.property] = {}; p.methods.forEach((m) => { obj[p.property][m.name] = (params: any[]) => m.call + "____" + params.length; }); }, }; obj.extend({ property: "Scope1", methods: [ { name: "functionName", call: "function_name", params: 1, }, ], }); // How to add type to make below code not prompt type errors in typescript. In typescript, this code below will prompt type errors. console.log(obj["Scope1"].functionName(["firstParam"]));Cómo agregar tipo para que ese código no indique errores de tipo en mecanografiado. obj extender métodos, todos los métodos se pusieron en una propiedad.
Tiene un requisito muy genérico con respecto a cómo funciona extend() .
Para evitar los errores de tipo y hacerlo genérico, podemos definir un ObjectTemplate para satisfacer el compilador de TypeScript para que podamos asignar un valor al objeto sobre la marcha.
type Args = { property: string; methods: { name: string; call: string; params: number }[]; } type ObjTemplate = { extend: (args: Args) => void; [k: string]: any } const obj: ObjTemplate = { extend: (p: Args) => { obj[p.property] = {}; p.methods.forEach((m) => { obj[p.property][m.name] = (params: any[]) => m.call + "____" + params.length; }); } }; obj.extend({ property: "Scope1", methods: [ { name: "functionName", call: "function_name", params: 1, }, ], }); console.log(obj["Scope1"].functionName(["firstParam"]));Según mecanografiado-interfaz-problema encuentro una respuesta.
export const obj = { extend: <T extends string, O extends string>(a: { property: T; methods: { name: O; call: string; params: number }[]; }): { [Prop in typeof a as Prop["property"]]: { [Prop in typeof a.methods[number] as Prop["name"]]: ( ...args: any ) => Promise<any>; }; } => { const obj = {} as any; a.methods.forEach((method) => { obj[method.name] = (...args: any) => { return Promise.resolve("success"); }; }); const newObject = { [a.property]: obj, }; return newObject; }, }; const extendedObj = obj.extend({ property: "Scope1", methods: [ { name: "functionName", call: "function_name", params: 1, }, ], });Después de eso, podemos conseguir esto.