typestar

Validar datos unknown en TypeScript

Parsear en la frontera, para que el interior del programa quede tipado.

interface Run {
  lang: string;
  tpm: number;
  stars?: number;
}

type Issue = { path: string; message: string };

function validateRun(input: unknown): { run: Run } | { issues: Issue[] } {
  const issues: Issue[] = [];
  const raw = (typeof input === "object" && input !== null ? input : {}) as
    Record<string, unknown>;

  if (typeof raw.lang !== "string" || raw.lang.length === 0) {
    issues.push({ path: "lang", message: "required string" });
  }
  if (typeof raw.tpm !== "number" || Number.isNaN(raw.tpm)) {
    issues.push({ path: "tpm", message: "required number" });
  }
  if (raw.stars !== undefined && typeof raw.stars !== "number") {
    issues.push({ path: "stars", message: "must be a number" });
  }

  return issues.length
    ? { issues }
    : { run: { lang: raw.lang as string, tpm: raw.tpm as number,
               stars: raw.stars as number | undefined } };
}

const parsed = validateRun(JSON.parse('{"lang":"ts","tpm":98}'));
console.log("run" in parsed ? parsed.run.lang : parsed.issues);
console.log(validateRun({ tpm: "fast" }));

Cómo funciona

  1. Cada campo se chequea antes de confiar en el objeto.
  2. El predicado convierte unknown en tu tipo.
  3. Esto es lo que hace una biblioteca de esquemas, en veinte líneas.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
32
Caracteres a escribir
998
Tokens
264
Ritmo de tres estrellas
105 tpm

Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 151 segundos.

Escribe este fragmento

Paso 3 de 4 en Resultados y validación; paso 7 de 19 en Clases y patrones.

← Anterior Siguiente →