Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

98
Views
Cómo establecer una buena condición para la propiedad dinámica del objeto

Tengo una serie de objetos:

 export const inputsArray: InputAttributes[] = [ { label: 'Name', type: 'text', name: 'name', required: true }, { label: 'User name', type: 'text', name: 'username', required: true }, ... ]

y mapearlo así:

 const inputs = inputsArray.map(input => { const value = (input.name === 'street' || input.name === 'city' || input.name === 'zipcode') // <= PROBLEM : NOT EFFECTIVE CONDITION! ? user?.address?.[input.name] : user?.[input.name] // <= TYPESCRIPT PROBLEM return ( <Input key={input.name} defaultValue={value} input={input} disabled={disabled} onChange={hadndleChange} /> ) })

Información en el usuario:

 export interface User { id: number, name: string, username: string, email: string, address: { street: string, city: string, zipcode: string, } phone: string, website: string, company: { name: string } }
  1. Como puede ver, dentro del método de mapa tengo una condición para el valor. Pero no es bueno, porque si el objeto de usuario tiene más propiedades adicionales dentro de la dirección o la empresa u otra propiedad con el objeto como valor, necesito poner más condiciones dentro. ¿Hay algún patrón mejor para hacer eso?
  2. user?.[input.name] dice que "el tipo 'cadena' no se puede usar para indexar el tipo 'Usuarios'". Puedo evitar ese problema configurando [key: string] : any dentro de la interfaz de usuario, pero ¿hay algún patrón mejor?

Interfaz de atributos de entrada si es necesario:

 export interface InputAttributes { label: string, type: string, name: string, pattern?: string, required: boolean }
about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Debe modificar la interfaz de InputAttributes de esta manera:

 type DeepKeyOf<T> = { [K in keyof T]: T[K] extends Record<string, any> ? DeepKeyOf<T[K]> : K }[keyof T] export interface InputAttributes { label: string, type: string, name: DeepKeyOf<User>, pattern?: string, required: boolean }

Ahora TypeScript sabe que la propiedad del name debe contener alguna clave de User .

about 4 years ago · Juan Pablo Isaza Report

0

Almacene los valores en una matriz, luego use Array.prototype.some() . Esto le permitirá admitir tantos nombres como desee.

 const names = ['street', 'zipcode', 'city']; const value = names.some((name) => input.name === name) ? user?.address?.[input.name] : user?.[input.name];
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!