Patrones
¿Cómo hago que un ayudante infiera una tupla literal sin exigir `as const`?
Marca el parámetro como `const`; la inferencia preferirá formas literales readonly frente a arrays y primitivos ampliados.
La receta
function tuple<const T extends readonly unknown[]>(...values: T): T { return values } const statuses = tuple('idle', 'loading', 'done') const point = tuple(10, 20)
La compilación compila esto y comprueba cada resultado de abajo.
Cómo funciona
- 01
const T extends readonly unknown[]
`const` cambia la preferencia de inferencia y la restricción readonly aporta un destino estrecho compatible.
- 02
...values: T
El parámetro rest registra cada argumento como una posición de la tupla.
Lo que obtienes
typeof statuses→readonly ["idle", "loading", "done"](typeof statuses)[number]
→"idle" | "loading" | "done"typeof point→readonly [10, 20]
Dónde falla
La inferencia const es superficial y basada en preferencia. Los valores ya guardados en variables ampliadas siguen ampliados, y restricciones mutables pueden devolver arrays mutables.
Conclusión
Usa parámetros de tipo const en límites de API donde convenga precisión literal sin sintaxis adicional.
