Un tipo Result en TypeScript
Errores en el tipo de retorno, para que quien llama no pueda olvidarlos.
type Result<T, E = Error> =
| { ok: true; value: T }
| { ok: false; error: E };
const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });
const err = <E>(error: E): Result<never, E> => ({ ok: false, error });
function parsePort(raw: string): Result<number, string> {
const port = Number.parseInt(raw, 10);
if (Number.isNaN(port)) return err(`not a number: ${raw}`);
if (port < 1 || port > 65535) return err(`out of range: ${port}`);
return ok(port);
}
function map<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> {
return result.ok ? ok(fn(result.value)) : result;
}
const parsed = parsePort("8080");
console.log(parsed.ok ? parsed.value : parsed.error);
console.log(map(parsePort("99999"), (n) => n * 2));
Cómo funciona
- Una unión discriminada hace explícitos los dos desenlaces.
- Estrechar sobre
okte da el valor o el error. - Unos helpers mantienen corta la construcción.
Palabras clave y builtins usados aquí
ENumberResultTconstfalsefunctionifisNaNnumberparseIntreturnstringtruetype
El intento, en números
- Líneas
- 21
- Caracteres a escribir
- 739
- Tokens
- 261
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 149 segundos.
Paso 1 de 4 en Resultados y validación; paso 5 de 19 en Clases y patrones.