Búsqueda de sitios web

Devolver promesa si no hay callback en TypeScript


Quiero devolver una promesa si no hay un callback en mi función. Mi código es así:

function dropDatabase(callback?: (error: Error, result: boolean) => void): Promise<boolean> {

  if (typeof callback === 'function') return callback(null, true);

  return new Promise((resolve, reject) => resolve(true));
}

// using
dropDatabase((err, droped) => console.log(droped));

dropDatabase().then(droped => console.log(droped));

Cuando compilo, obtengo un error como este Type 'void' no se puede asignar al tipo 'Promise<boolean>'

¿Cómo puedo arreglarlo?

Respuesta #1

La firma de tu función dice que devolverá un Promise. Pero cuando tienes un callback, no estás devolviendo un Promise. Cambiar el tipo de retorno a Promise | void solucionará eso.

También puedes añadir múltiples firmas de tipo para dejar claro exactamente cuándo devuelve void y cuándo devuelve un Promise. De esa manera, no tendrás que verificar qué tipo devolvió realmente en cada uso.

Aquí está el código corregido. También añadí el argumento de tipo <boolean> a Promise.

function dropDatabase(callback: (error: Error, result: boolean) => void);
function dropDatabase(): Promise<boolean>;

function dropDatabase(callback?: (error: Error, result: boolean) => void): Promise<boolean> | void {
    if (typeof callback === 'function') return callback(null, true);

    return new Promise((resolve, reject) => resolve(true));
}

Respuesta #2

Usa la sobrecarga:

function dropDatabase(callback: (error: Error, result: boolean) => void);
function dropDatabase(): Promise<boolean>;

function dropDatabase(callback?: (error: Error, result: boolean) => void): 
  void | Promise<boolean> {
    if (callback) callback(new Error("error"), true);
    else return Promise.resolve(true);
}