es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tipo de retorno condicional que extiende indefinido

Estoy en el proceso de crear una utilidad para manejar respuestas de API donde me gustaría evitar que los consumidores tengan que verificar si es indefinido al especificar un tipo genérico:

export async function createAPIResponse<t =="" undefined="">(
    request: Request,
    response: Response
): Promise<t extends="" undefined="" undefined="" :="" t=""> {
    if (response.status === 204) {
        return;
    }

    if (!response.ok) {
        try {
            throw new APIError(request, response, await response.json());
        } catch {
            throw new HTTPError(request, response);
        }
    }

    return response.json();
}

TypeScript me da el siguiente error:

Type ‘undefined’ is not assignable to type ‘T extends undefined ? undefined : T’. ts(2322)

Mi objetivo es poder utilizar la función de esta manera:

// No se espera respuesta y no se pasa ningún genérico a la función
try {
    await createAPIResponse(putRequest, responseWithStatus204AndNoBody);
} catch (error) {
    console.error(error);
}

// Se espera una respuesta de tipo SomeType
try {
    const jsonData = await createAPIResponse<sometype>(getRequest, responseWithStatus200AndJSONBody);
    console.log(jsonData);
} catch (error) {
    console.error(error);
}

He buscado algunas posibles soluciones (por ejemplo, https://stackoverflow.com/questions/62896115/how-to-do-a-conditional-generic-type-that-has-a-value-when-it-is-undefined-but-n), pero aún no he encontrado una que no produzca un error.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El error ocurre porque la función intenta devolver undefined cuando T no está definido, pero el tipo de retorno es T extends undefined ? undefined : T. Esto significa que el tipo de retorno solo puede ser undefined si T también es undefined.

    Una posible solución para evitar el error es cambiar el tipo de retorno a T | undefined, lo que significa que la función puede devolver tanto un valor de tipo T como undefined. Esto se puede hacer modificando la firma de la función de la siguiente manera:

    export async function createAPIResponse<t =="" undefined="">(
      request: Request,
      response: Response
    ): Promise<t |="" undefined=""> {
      // ...
    }
    

    Con este cambio, la función se puede utilizar como se pretende sin producir un error:

    “`typescript
    // No se espera ninguna respuesta y no se pasa ningún genérico a la función
    try {
    await createAPIResponse(putRequest, responseWithStatus204AndNoBody);
    } catch (error) {
    console.error(error);
    }

    // Se espera una respuesta de tipo SomeType
    try {
    const jsonData = await createAPIResponse(getRequest, responseWithStatus200AndJSONBody);
    console.log(jsonData);
    } catch (error) {
    console.error(error);
    }
    “`

Comments are closed.