Solución comentada
Publicado el 20 de agosto de 2026La solución
type Getters<T> = { [K in keyof T as `get${Capitalize<K & string>}`]: () => T[K] }
El error más común
type Getters<T> = { [K in keyof T as `get${K & string}`]: () => T[K] }
Todo es correcto salvo la capitalización: esto produce getname y getage. La concatenación por sí sola no capitaliza, y en nombres de método camelCase ese único carácter es toda la convención.
Línea por línea
K & stringkeyof Tpuede incluirsymbolynumber, yCapitalizeno acepta ninguno. Intersecar constringacota la clave a la parte interpolable y descarta el resto en silencio.() => T[K]El valor se convierte en un tipo función mientras se reescribe la clave. Ambas mitades de la propiedad cambian en el mismo mapeo, por eso no hace falta una segunda pasada.
Para recordar
El renombrado de claves se compone con todo lo demás del sistema de tipos: literales de plantilla, tipos intrínsecos de mayúsculas y condicionales funcionan dentro de una cláusula as. Así generan sus API los ORM y los tipos de emisores de eventos.

