Skip to content
question

Error de TypeScript que no entiendo: Property 'nombre' does not exist on type 'never'

Lucía Ferrer@lucia_ferrer_dev

October 8, 2026 · 1 min read

Holaaa! Llevo una hora con esto y me da vergüenza preguntarle otra vez a mi tech lead jajaja. Tengo esto en un componente:

const [usuarios, setUsuarios] = useState([])

useEffect(() => {
  fetch('/api/usuarios')
    .then(res => res.json())
    .then(data => setUsuarios(data))
}, [])

return (
  <ul>
    {usuarios.map(u => <li key={u.id}>{u.nombre}</li>)}
  </ul>
)

Y TypeScript me marca en rojo u.id y u.nombre:

Property 'nombre' does not exist on type 'never'.

He probado a poner any y se quita, pero mi tech lead me dijo en la review que nada de any xD. ¿Qué es "never" y por qué sale aquí? Explain me please como si tuviera 5 años!!

Accepted answer

Sofía Ramírez#1 in Código en Español3 likes

¡Hola Lucía! Pregunta súper válida 💜 Cuando haces useState([]) TypeScript tiene que adivinar el tipo con lo único que le das: un array vacío. Un array vacío no tiene elementos, entonces TS dice "esto es un array de... nada", o sea never[]. Y claro, "nada" no tiene propiedad nombre. La solución es decirle qué va a haber dentro: interface Usuario { id: number nombre: string } const [usuarios, setUsuarios] = useState<Usuario[]>([]) Con eso ya te autocompleta u.nombre, y si escribes u.nombr te avisa. Bonus: res.json() devuelve any, así que si quieres ser estricta pon .then((data: Usuario[]) => setUsuarios(data)), o mejor valida con zod. Tu tech lead tiene razón con lo del any jaja

View in the thread

Get the best of #codigo_en_espanol weekly

One email each Monday with the most useful posts. No spam; unsubscribe in one click.

Comments

7

Sign in to join the conversation.

Sign in to comment

Accepted answer

Sofía Ramírez@sofi_dev_mx#1 in Código en Español
¡Hola Lucía! Pregunta súper válida 💜 Cuando haces useState([]) TypeScript tiene que adivinar el tipo con lo único que le das: un array vacío. Un array vacío no tiene elementos, entonces TS dice "esto es un array de... nada", o sea never[]. Y claro, "nada" no tiene propiedad nombre. La solución es decirle qué va a haber dentro: interface Usuario { id: number nombre: string } const [usuarios, setUsuarios] = useState<Usuario[]>([]) Con eso ya te autocompleta u.nombre, y si escribes u.nombr te avisa. Bonus: res.json() devuelve any, así que si quieres ser estricta pon .then((data: Usuario[]) => setUsuarios(data)), o mejor valida con zod. Tu tech lead tiene razón con lo del any jaja
3 net votes
Lucía Ferrer@lucia_ferrer_dev#6 in Código en Español
OMG funcionaaa!! Y ahora entiendo lo de never, es como 'array de la nada' jajaja. Muchísimas gracias Sofía!! 🙏
1 net votes
Javier Montero@javi_montero#4 in Código en Español
Lucía, en Java esto sería List<Usuario> usuarios = new ArrayList<>(); y el compilador tampoco te deja inventar. Los genéricos son tus amigos. Y pregúntale a tu tech lead las veces que haga falta, que para eso cobra más que tú.
1 net votes
Lucía Ferrer@lucia_ferrer_dev#6 in Código en Español
jajaja vale Javi, apuntado lo de preguntar sin vergüenza!
0 net votes
Camilo Restrepo@camilo_parce#3 in Código en Español
Buenísima la explicación de Sofi. Yo agrego: si el endpoint también lo controlan ustedes, compartan el tipo entre backend y frontend y se ahorran sustos
1 net votes
Bram Verhoeven@bram_on_a_bike1 rep in Código en Español
Used translate. Sofía is correct. Lucía, write the type the first time you create the state and TypeScript is quiet forever. Good that you did not use any. Lekker 🚲
0 net votes
Luis Treviño@luis_qa_mty#8 in Código en Español
y cuando llegues a los tests, el tipo Usuario te sirve para los mocks. todo se conecta 🤣
1 net votes