Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

173
Vistas
¿Cómo manejar el tipo de JSON entrante cuyo contenido no conozco?

Tengo el siguiente código ...

 let services = [] fetch('http://localhost:11492/api') .then(r => r.json()) .then(r => { for (const service in r.services) { r.services.service = service services.push(r.services[service]) } })

... que ESLint marca con ...

 ESLint: Unsafe member access .services on an `any` value. (@typescript-eslint/no-unsafe-member-access)

... en varios lugares, comenzando con r en el ...

 for (const service in r.services)

... línea.

El problema es que no sé cuál será el contenido exacto del contenido JSON. Solo sé que tendrá una estructura como

 { "services": { "something": { // anything can happen here }, "somethingElse": { // anything can happen here, different from the above }, (...) }

pero el contenido de las entradas no está definido.

Mi pregunta: ¿cómo puedo expresar la estructura JSON anterior como un tipo correspondiente?

Pensé que podría emitir este (primer) error como

 for (const service in r.services as Record<string, any>)

pero no ayuda porque el problema es con el tipo de r en sí.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Analizar JSON es difícil para mecanografiado porque ningún código de tiempo de compilación puede garantizar la estructura de datos de ese JSON. Por lo tanto, debe escribir fuertemente lo que pueda y dejar el resto como unknown .

En este caso, creo que se vería así:

 interface MyJson { services: Record<string, unknown> } let services: unknown[] = [] fetch('http://localhost:11492/api') .then(r => r.json()) // r.json() returns Promise<any> .then((r: MyJson) => { // assume any is your known JSON structure for (const service in r.services) { r.services.service = service services.push(r.services[service]) } })

Tenga en cuenta cómo services se escriben como unknown[] , porque afirma que la estructura de datos más allá literalmente no se puede conocer en el momento de la compilación. Así que este tipo es el único tipo que tiene sentido.

unknown no es un tipo con el que pueda hacer mucho con ningún tipo de seguridad, porque Typescript no puede imponer nada sobre su uso. Tal vez esté bien porque solo está pasando a otra cosa, como escribir en un archivo.

Pero mi corazonada es que hay una estructura para esos datos, podría ser complejo. Puede involucrar uniones de múltiples valores o tipos de plantillas de cadenas , pero probablemente haya una manera de escribir ese tipo si estudia la documentación. Y luego editaría el tipo MyJson para que coincida con ese tipo.

También puede escribir predicados para probar valores unknown para cosas específicas y convertirlos de forma segura en tipos conocidos.

Sin embargo, hay muchas maneras de manejar esto. Y la solución correcta depende de cuál sea la estructura de datos, qué tan confiable es el formato de los datos para que sean consistentes, qué tan importante es que el uso sea seguro en su programa y muchos otros factores.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Luego establezca el tipo de r :

 .then((r: { services: Record<string, any> }) => { for (const service in r.services) { r.services.service = service services.push(r.services[service]) } })
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda