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

81
Views
Manejo de propiedades opcionales de objetos para ser usados como propiedades mapeadas o indexadas

Estoy trabajando en un escenario de manejo de una propiedad de tipo array con acceso indexed . Traté de encapsular el problema en su forma más simple aquí.

 type User = { readonly name: string; readonly roles: ReadonlyArray<string>; } const buildActions = <T extends User>(u: T) => { // Implementation return {login: (role: T['roles'][number]) => { console.log(u, role); }} } const actions = buildActions({name: 'user', roles: ['admin', 'client']} as const); actions.login('client');

Así que el código anterior funciona bien. Pero en mi escenario, los roles de propiedad son opcionales.

 type User = { readonly name: string; readonly roles?: ReadonlyArray<string>; }

En el caso anterior obtenemos un error

El tipo 'número' no se puede usar para indexar el tipo 'T["roles"]'

Traté de usar el tipo condicional para manejar el escenario, pero no funcionó.

 const buildActions = <T extends User>(u: T) => { // Implementation return {login: (role: T['roles'] extends never ? never : T['roles'][number]) => { console.log(u, role); }} }

Definitivamente no es la forma correcta de manejar tal escenario, pero cubre muy bien el caso de uso.

¿Alguna idea de cómo superar este escenario de tipeo?

Gracias

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

El uso de los tipos condicionales resolvió el problema.

 type User = { readonly name: string; readonly roles?: ReadonlyArray<string>; } const buildActions = <T extends User>(u: T) => { // Implementation return {login: (role: T['roles'] extends string[] ? T['roles'][number] : never) => { console.log(u, role); }} } const actions = buildActions({name: 'user', roles: ['admin', 'client']} as const); actions.login('client');

Lo intenté antes, pero parece que hay problemas de precedencia con la palabra clave TS extends . Considerando que T['roles'] como tipo string[] | undefined El siguiente código a continuación funciona bien:

 T['roles'] extends string[] ? T['roles'][number] : never

Pero si invertimos la condición falla.

 T['roles'] extends undefined ? never : T['roles'][number]

Por lo tanto, nunca use tipos condicionales con una afirmación undefined .

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!