Búsqueda de sitios web

pregunta sobre el patrón encontrado de return null en TypeScript


Si tengo una interfaz User de la siguiente manera:

export interface User {
  username: string;
  hash: string;
}

y tengo una firma de método que se ve así y que devuelve un User típicamente desde una base de datos

function getUser(username: string): Promise<User>

Entonces, en un programa que llama, querría hacer algo como esto:

  const user: User = await getUser(username);
  if (user && (await passMatch(password, user.hash))) {
    return genToken();
  }

¿Cuáles son algunos patrones populares de tipos de retorno y combinaciones de validación cuando el usuario no se encuentra?

En Java (correcto o incorrecto) devolvería null y haría una verificación de null.

¿Es un error throw not found y capturarlo, un buen patrón? No puedo reconciliar que no encontrar uno no sea un error.

Respuesta #1

Si no encontrar un usuario no es un error, entonces deberías cambiar la firma del método así:

function getUser(username: string): Promise<User | null>

Luego, dentro del(los) método(s) que llama, deberías lanzar un error si se ajusta a la regla del método (además, no necesitarías el : User ya que es implícito por el método):

  const user = await getUser(username);
  if (!user) throw new Error...
  if ((await passMatch(password, user.hash))) {
    return genToken();
  }

O si en realidad no necesitas lanzar un error, simplemente mantenlo como lo estás haciendo dentro del método.

Además, probablemente cambiaría ese await dentro del if:

  const passwordCorrect = await passMatch(password, user.hash);
  if (!passwordCorrect) {
    throw...
  }
  return genToken();

PD:

Si quieres usar buenos patrones y aplicarlos en tu proyecto, te aconsejo encarecidamente que uses lint. Recomiendo la configuración de TypeScript de Airbnb:

https://www.npmjs.com/package/eslint-config-airbnb-typescript