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

331
Views
La propiedad 'foo' no existe en el tipo '{}' cuando se usa el nuevo Proxy({}), .....)

No estoy usando mecanografiado (y, en este momento, no tengo la intención de hacerlo), pero la configuración predeterminada para VSCode parece haberme comprobado. Es un poco útil, un poco molesto. Quiero quedarme con eso por ahora.

Mi código que causa este problema es:

 let { localApiVersion, localDate, remoteVersion, remoteDate, } = new Proxy({}, { get: () => null });

Que tomé de mi respuesta aquí . Estoy haciendo esto porque no tenía ganas de hacer let localApiVersion = null cuatro veces.

Sin embargo, VSCode me está dando este error:

La propiedad 'localApiVersion' no existe en el tipo '{}'.ts(2339)

El cheque (creo) es porque mi jscongig.json se ve así:

 { "compilerOptions": { "module": "commonjs", "target": "es2019", "checkJs": true }, "exclude": [ "node_modules", "**/node_modules/*" ] }

Sé que puedo escribir // @ts-ignore encima de esa línea, pero no quiero adquirir ese hábito.

¿Hay alguna manera, sin eliminar el cheque (o agregar mecanografiado al proyecto), para informar a VSCode que están bien?

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Esto es lo que funcionó para mí (favor de votar las otras respuestas también, fueron fundamentales para que yo llegara aquí):

 let { localApiVersion, localDate, remoteVersion, remoteDate, } = /** @type {Object.<string, (null|string)>} */ (new Proxy({}, { get: () => null }));

Tenga en cuenta que la anotación @type va antes de new y toda la parte del constructor está envuelta entre paréntesis. Estoy usando (null|string) en lugar de unknown a) porque sé que se reasignará a una cadena yb) por lo que todavía obtengo una verificación de tipo, aunque antes de la reasignación puede cometer errores de tipo . Puedo cambiarlo simplemente a null y, al cambiar el tipo, usar explícitamente este tipo de cosas: @type {string} (localApiVersion) .

Y aquí está la información sobre herramientas en VSCode:

información sobre herramientas para resaltar 'localApiVersion' que dice: let localApiVersion: string

Usar typedef también funcionará:

 /** * @typedef {Object.<string, (null|string)>} InitProxy */ let { localApiVersion, localDate, remoteVersion, remoteDate, } = /** @type {InitProxy} */ (new Proxy({}, { get: () => null }));

Pero esto está llegando a los niveles de verbosidad que estoy tratando de evitar.

about 4 years ago · Juan Pablo Isaza Report

0

El tipo {} proviene de la restricción de T extends object en ProxyConstructor ; en ausencia de un tipo explícito, T se resuelve en un objeto vacío, o {} .

Sin embargo, {} no cumple con los requisitos, ya que no tiene ninguna propiedad, mientras que su código requiere que tenga localApiVersion , localDate , etc. Sí, JavaScript conoce estas propiedades (o más bien no le importa), pero TypeScript no los conoce y no puede comunicarse con el código de tiempo de ejecución.

La solución es tipear al menos algo en esta imagen, para que TypeScript pueda inferir las tipificaciones correctas. En un archivo .ts es trivial. Sin embargo, en un archivo .js , esto es lo que se puede hacer:

 // @ts-check /** @type {Record<string, unknown>} */ const target = {}; let { foo, bar, baz } = new Proxy(target, { get: () => null });
about 4 years ago · Juan Pablo Isaza Report

0

Parece bastante sorprendente que obtenga un error de TypeScript en el código de JavaScript, pero puede proporcionar información de tipo a través de las anotaciones de JSDoc (consulte aquí , aquí y aquí ), que son solo comentarios, por lo que no es necesario usar el compilador de TypeScript antes de ejecutarse. el código en un entorno JavaScript.

Habiendo dicho eso, simplemente no puedo hacer que funcione con las anotaciones JSDoc. Espero que esto funcione, porque el tercer enlace anterior dice que puede escribir afirmaciones de esta manera:

 // @ts-check /** * @typedef {Object} Stuff - comment here * @property {any} localApiVersion - comment here * @property {any} localDate - comment here * @property {any} remoteVersion - comment here * @property {any} remoteDate - comment here */ let { localApiVersion, localDate, remoteVersion, remoteDate, } = new Proxy(/** @type {Stuff} */ {}, { get: () => null });;

Pero eso no funciona. :-(

Solo por lo que vale, esto es fácil en TypeScript:

 interface Stuff { localApiVersion: any; localDate: any; remoteVersion: any; remoteDate: any; } let { localApiVersion, localDate, remoteVersion, remoteDate, } = new Proxy({} as Stuff, { get: () => null }); // ^^^^^^^^−−−−−−− type assertion // I normally avoid type assertions, but this use of the Proxy with get // trap is a very special case.

(Ejemplo en el patio de juegos de TypeScript ).

Esperaría que fuera posible con las anotaciones de JSDoc, ya que sé que la gente usa la verificación de tipos de TypeScript de esa manera, pero, bueno, solo uso TypeScript y no he podido encontrar un equivalente de JSDoc.

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!