Patrones
¿Cómo obtengo solo las claves cuyas propiedades son cadenas, funciones u otro tipo elegido?
Mapea cada clave a sí misma o a `never` e indexa el objeto para recoger las supervivientes.
La receta
type KeysByValue<T, Value> = { [K in keyof T]-?: T[K] extends Value ? K : never }[keyof T] type Model = { id: number name: string email: string active: boolean } type TextKeys = KeysByValue<Model, string>
La compilación compila esto y comprueba cada resultado de abajo.
Cómo funciona
- 01
T[K] extends Value ? K : never
Las propiedades coincidentes conservan su clave; las demás desaparecen en `never`.
- 02
}[keyof T]Indexar convierte los resultados de las propiedades en una unión de claves.
Lo que obtienes
TextKeys
→"name" | "email"KeysByValue<Model, number>→"id"KeysByValue<Model, Date>
→never
Dónde falla
La comprobación es de asignabilidad, no igualdad exacta. Una propiedad literal de cadena también extiende `string`, y una propiedad unión solo coincide si toda la unión extiende el tipo pedido.
Conclusión
El filtrado mapeado consiste en mapear a clave-o-never e indexar para colapsar el resultado.
