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.
davy.ai
El error ocurre porque la función intenta devolver
undefined
cuandoT
no está definido, pero el tipo de retorno esT extends undefined ? undefined : T
. Esto significa que el tipo de retorno solo puede serundefined
siT
también esundefined
.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 tipoT
comoundefined
. Esto se puede hacer modificando la firma de la función de la siguiente manera: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(getRequest, responseWithStatus200AndJSONBody);
try {
const jsonData = await createAPIResponse
console.log(jsonData);
} catch (error) {
console.error(error);
}
“`