Saltar al contenido
webtype.org#226 rebuild-readonly · par 2

N.º 226 · 3 de agosto de 2026 · Suave

Reconstruye Readonly

Implementa `MyReadonly<T>` para que cada propiedad sea `readonly`. Solo un nivel — los objetos anidados se dejan tal cual.

01

Intenta el puzle tú mismo

Par 2

Puzle

rebuild-readonly.ts
interface Config {
  host: string
  port: number
}
Intento 1 de 2Aún sin comprobar

Sustituye ??? — tu solución se comprueba con los casos de abajo. Tab indenta; pulsa Escape y luego Tab para sacar el foco.

Comprobaciones

3
  • MyReadonly<Config>
    { readonly host: string; readonly port: number }
  • MyReadonly<{ a: string }>
    { readonly a: string }
  • MyReadonly<{}>
    {}

Cómo se juzga una comprobación Igualdad exacta de tipos, no asignabilidad — una intersección no es lo mismo que el objeto aplanado.

Cómo le fue a todo el mundo

Menos de 5 personas han resuelto este puzle hasta ahora. La distribución aparece cuando la muestra sea lo bastante grande como para significar algo.

Archivo
02

Solución comentada

Publicado el 4 de agosto de 2026

La solución

type MyReadonly<T> = { readonly [K in keyof T]: T[K] }

El error más común

type MyReadonly<T> = { [K in keyof T]: Readonly<T[K]> }

Esto aplica `Readonly` a cada *valor* en lugar de al mapeo. Para un primitivo como `string` no hace nada, así que las claves siguen siendo mutables y el resultado es una copia de `T`.

Línea por línea

  1. readonly [K in keyof T]

    El modificador precede a la cláusula de clave, igual que escribirías `readonly host: string` en una interfaz. Marca la propiedad, no el tipo de su valor.

  2. T[K]

    El valor pasa intacto, que es lo que lo mantiene superficial. Recurrir aquí es exactamente cómo se construye `DeepReadonly`.

Para recordar

Los modificadores actúan sobre propiedades; envolver el tipo del valor es otra operación distinta. Confundirlas produce un tipo que parece correcto y no impone nada.