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

262
Vistas
¿Cómo usar objetos anidados en TypeScript? La propiedad no existe en el tipo 'objeto'

Tengo una pequeña aplicación React/GraphQL que funciona bien, y estoy tratando de agregarle TypeScript, ya que soy nuevo en TypeScript y trato de aprenderlo. Tengo un punto final de la API de GraphQL que devuelve productos e información sobre esos productos. Usando React, almaceno productos en un estado y luego renderizo cada producto usando JSX.

Creé un Product de tipo con la información que espero que devuelva la API, pero también devuelve objetos anidados, y todo lo que probé genera un error de TypeScript. Este es un ejemplo simplificado de lo que devuelve la API:

 { "data": { "products": [ { "productName": "Soda", "code": "sod", "prices": { "nationalPrices": { "localPrices": [ { "pricePerUnit": "1.99" } ], "regionalPrices": [ { "pricePerUnit": "2.49" } ] }, "vendorPrices": { "localPrices": [ { "pricePerUnit": "1.49" } ] } } }, // more products... ] } }

Y esta es la solución que tengo actualmente. El code , productName y prices funcionan bien, pero los precios nationalPrices están activando una property nationalPrices does not exist on type 'object' . ¿Qué puedo hacer para corregir este error?

 type nationalPricesObject = { localPrices: object[]; } type Product = { code: string; productName: string; prices: object; nationalPrices: nationalPricesObject; } function ProductList() { const [products, setProducts] = useState < Product[] > ([]); const { loading, data, error } = useQuery(LOAD_PRODUCTS); useEffect(() => { if (data) { setProducts(data.products); } }, [data]); return ( <> <div> {products.map(p => ( <div> <ProductCard productName={p.displayName} code={p.code} // simplified code below for sake of clearity pricePerUnit={p.prices.nationalPrices.localPrices[0]['pricePerUnit']} /> </div> ))} </div> </> ) }
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

El producto no contiene una propiedad nationalPrices . Product.prices sí. Podemos establecer un tipo Precios que contenga lo que se espera en Producto.precios, y usarlo para definir la propiedad de precios del objeto Producto.

 type Prices = { nationalPrices: nationalPricesObject; vendorPrices: someOtherPricesObject; } type Product = { code: string; productName: string; prices: Prices; }
about 4 years ago · Juan Pablo Isaza Denunciar

0

El uso del object es complicado en mecanografiado y, en general, no se recomienda. Aquí tienes dos problemas:

  1. El object es un tipo ambiguo, por lo que no puede usar precios.Preciosnacionales porque nationalPrices prices.nationalPrices no existen en el tipo de object .
  2. Una vez que solucione esto, también encontrará un error de que localPrices[0] que es de tipo object , no tiene pricePerUnit

Para corregir esto, haga que sus tipos sean más específicos:

 type nationalPricesObject = { localPrices: { pricePerUnit: number; }[]; // assuming this is number? } type Product = { code: string; productName: string; prices: nationalPricesObject; }

Por último, por convención, los tipos en mecanografiado deben ser PascalCase y se deben preferir las interfaces. Entonces, cambiaría tu código para que se vea así:

 interface Price { pricePerUnit: number; } interface NationalPrices { localPrices: Price[]; } interface Product { code: string; productName: string; prices: NationalPrices; }
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