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

176
Views
¿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 answers
Answer question

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 Report

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 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!