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
- Cada campo se chequea antes de confiar en el objeto.
- El predicado convierte
unknownen tu tipo. - Esto es lo que hace una biblioteca de esquemas, en veinte líneas.
Palabras clave y builtins usados aquí
IssueJSONNumberRunasconstfunctionifinterfaceisNaNnumberreturnstringtypeunknown
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.
Paso 3 de 4 en Resultados y validación; paso 7 de 19 en Clases y patrones.