Operadores
as const
Impide que el compilador ensanche un literal a su tipo general.
Qué es
Por defecto `const x = 1` es `1`, pero `{ a: 1 }` tiene `a: number`, porque las propiedades de objeto son mutables y un hueco mutable no puede prometer seguir siendo `1`. `as const` dice que aquí nada será reasignado, así que los tipos literales se conservan y los arrays pasan a ser tuplas de solo lectura. Es la puerta de entrada a casi todo truco a nivel de tipos que parte de datos reales.
Ejemplos
typeof plain→{ kind: string; sides: number; }typeof frozen→{ readonly kind: "circle"; readonly sides: 0; }Cada propiedad pasa a ser `readonly` y cada valor conserva su tipo literal.
typeof tuple→readonly [1, 2]Un array se convierte en una tupla de solo lectura, que es como un array literal llega al nivel de tipos con su longitud intacta.
Cada tipo resuelto de arriba lo imprimió TypeScript 5.9.3, no se escribió a mano.
Lo que no hace
- No congela nada en tiempo de ejecución. Eso lo hace `Object.freeze`; `as const` se borra y el objeto sigue siendo tan mutable como era.
- No atraviesa llamadas a función. `as const` se aplica al literal que escribiste, no a lo que devuelva una función.
Conclusión
Si un truco a nivel de tipos «no funciona con mis datos», comprueba si los datos se ensancharon. `as const` es la respuesta sorprendentemente a menudo.