Uso una pequeña función de utilidad/contenedor para funciones relacionadas con las operaciones de la base de datos. Debería tomar una función específica fn con el tipo Promise<PromiseReturnType<GENERIC>> , luego hacer algunas cosas (aquí: verificar la conexión) antes de ejecutarlo:
// File `A.ts` type PromiseReturnType<T = undefined> = {success: boolean, response: T } const DatabaseOperation = <Fn extends (...args: any) => Promise<PromiseReturnType<Data>>, Data>(fn: (...args: any) => Promise<PromiseReturnType<Data>>) => { return async function (...args: Parameters<Fn>): Promise<PromiseReturnType<Data>> { if (!isConnected) return Promise.reject({ success: false, response: new Error("Not connected to the Database!") }) return await fn(...args) } }Entonces lo uso como:
// File `B.ts` const dbOperation = async (myArg: number): Promise<PromiseReturnType<string> => { return Promise.resolve({ success: true, response: `hello world ${myArg}` }) } export default DatabaseOperation<typeof dbOperation, string>(dbOperation) Funciona bien, excepto que no se puede inferir el tipo de retorno. Será Promise<any> excepto Promise<PromiseReturnType<string>> .
El uso de esa función recién envuelta se verá así:
import dbOperation from "B.ts" (function () { await dbOperation() // Type: dbOperation(myArg: number): Promise<any> })()¿Alguna sugerencia sobre cómo resolver esto o implementarlo mejor en general?
Agradezco su ayuda, gracias.
Ya casi estabas allí:
declare var isConnected: boolean; type PromiseReturnType<T = undefined> = { success: boolean, response: T } const DatabaseOperation = <Data, Fn extends (...args: any[]) => Promise<PromiseReturnType<Data>>,>(fn: (...args: any[]) => Promise<PromiseReturnType<Data>>) => { return async function (...args: Parameters<Fn>): Promise<PromiseReturnType<Data>> { if (!isConnected) return Promise.reject({ success: false, response: new Error("Not connected to the Database!") }) return await fn(...args) } } const dbOperation = (myArg: number): Promise<PromiseReturnType<string>> => Promise.resolve({ success: true, response: `hello world ${myArg}` }) const fn = DatabaseOperation(dbOperation) const result = fn(42) // Promise<PromiseReturnType<string>> Deberías tener que hacer ...args una matriz any[] en lugar de any