readonly e inmutabilidad en TypeScript
Arreglos y objetos readonly, y hasta dónde llega la garantía.
type Config = { theme: string; langs: string[] };
const frozen: Readonly<Config> = { theme: "dracula", langs: ["ts"] };
// frozen.theme = "x"; // error: readonly
frozen.langs.push("go"); // permitido: solo un nivel de profundidad
function total(values: readonly number[]): number {
return values.reduce((sum, value) => sum + value, 0);
}
const scores: readonly number[] = [1, 2, 3];
// scores.push(4); // error: no hay push en un arreglo readonly
console.log(total(scores), [...scores].reverse());
type DeepReadonly<T> = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};
const deep: DeepReadonly<Config> = { theme: "paper", langs: ["ts"] };
console.log(deep.langs.length, frozen.langs.length);
Cómo funciona
readonly T[]no tiene push, pop ni sort.Readonly<T>congela un nivel, como el freeze del runtime.- El chequeo en compilación desaparece detrás de un cast con
as.
Palabras clave y builtins usados aquí
DeepReadonlyReadonlyconstextendsfunctionnumberreadonlyreturnstringtype
El intento, en números
- Líneas
- 19
- Caracteres a escribir
- 749
- Tokens
- 188
- Ritmo de tres estrellas
- 95 tpm
Al ritmo de tres estrellas de 95 tokens por minuto, este intento toma unos 119 segundos.
Paso 5 de 5 en Objetos e interfaces; paso 15 de 23 en Tipos y anotaciones.