Saltar al contenido
Seleccionar claves por su tipo de valor

    ↑↓ mover · ⏎ abrir · esc cerrar

    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

    1. 01
      T[K] extends Value ? K : never

      Las propiedades coincidentes conservan su clave; las demás desaparecen en `never`.

    2. 02
      }[keyof T]

      Indexar convierte los resultados de las propiedades en una unión de claves.

    Lo que obtienes

    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.

    Véase también

    Patrones