Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

87
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda