Estoy tratando de crear una fábrica de API para node.js, Express, Mongoose Tech stack. También quiero proporcionar seguridad de tipo completa usando Typescript y la opción de agregar validación adicional para creación y actualizaciones. Por ejemplo, tengo un "validador" así:
type ICheckIfUnique = <M, T extends Model<M>, K extends keyof M>( attributes: { model: T; key: K; }, body: M ) => void; export const checkIfUnique: ICheckIfUnique = async (attributes, body) => { const { model, key } = attributes; const value = body[key]; const isUnique = !(await model.findOne({ [key]: value })); if (!isUnique) { throw `${key} is not unique!`; } };Pero no puedo obtener el tipo correcto cuando obtengo:
Tampoco puedo encontrar la forma de obtener tipos de modelos personalizados para los métodos de fábrica:
export const factoryCreateEndpoint = <T, D extends Model<T>>(model: D, additionalLogic?: any) => async (req: Request, res: Response): Promise<Response | undefined> => { const body = req.body; if (!body) { return res.status(400).json({ success: false, error: `You must provide ${capitalize( model.collection.name.slice(0, -1) )}.`, }); } if (additionalLogic) { try { for (const element in additionalLogic) { const { validator, additionalVariables } = additionalLogic[element]; await validator(additionalVariables, req.body); } } catch (error) { return res.status(400).json({ success: false, error }); } } try { const object = new model(body); await object.save(); return res.status(201).json({ success: true, id: object._id, message: `${capitalize(model.collection.name.slice(0, -1))} created.`, }); } catch (error) { return res.status(400).json({ success: false, error }); } };Pero con este tipo genérico obtengo: