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

264
Views
¿Cómo usar TypeScript "keyof" para crear una interfaz para la interfaz API genérica?

Tengo problemas para usar el sistema de tipos de TypeScript para modelar una interfaz genérica para llamar desde Lua a TypeScript. Para que esto funcione, el desarrollador debe definir una interfaz de TypeScript que defina los métodos de TypeScript a los que Lua puede llamar. Los detalles no importan mucho aquí, ya que el ejemplo simple a continuación ilustra mi confusión.

KeyofDemo

Como puede ver en el código anterior, tengo "ApiInterface", que define métodos arbitrarios que un desarrollador puede querer invocar desde Lua. Todos estos métodos toman un primer argumento que es un objeto (similar a 'esto'), y los argumentos restantes pueden ser lo que el desarrollador necesite pasar de Lua al método TypeScript. En la práctica, los únicos tipos compatibles con estos argumentos restantes son primitivas como número, cadena, booleano, nulo. En el código de ejemplo anterior, definí 3 de estos métodos API, pero el desarrollador puede definir los métodos que desee. El objetivo de este módulo Lua-to-TypeScript es ser genérico y no estar vinculado a ninguna definición particular de "ApiInterface".

El tiempo de ejecución eventualmente empaqueta la llamada al método Lua-to-TypeScript en un objeto de tipo ApiCall, que puede ver que está definido con campos para el nombre del método, el objeto JavaScript que se usará para "esto" y los argumentos arbitrarios restantes.

Para ilustrar mi confusión, he mostrado una KeyofDemo para ilustrar el error de TypeScript que recibo. Hay un método de "ejecutar" en la clase KeyofDemo que quiere tomar el objeto ApiCall e invocar la función TypeScript/JavaScript correspondiente.

Puede ver el ondulado rojo debajo de la invocación real del método en los dos casos. Un caso es donde no hay argumentos adicionales (más allá del argumento "este" requerido), y el otro caso es cuando ApiCall.args en realidad se completa con una matriz de argumentos para pasar de Lua a TypeScript.

El mensaje de error del primer caso rojo ondulado es: A spread argument must either have a tuple type or be passed to a rest parameter .

El mensaje de error del segundo caso rojo ondulado es: Expected 3 arguments but got 1 .

Ninguno de estos mensajes de error tiene ningún sentido para mí. Si trato de compilar el código TypeScript anterior, el compilador informa errores similares.

¿Cómo puedo hacer que el sistema de tipos de TypeScript modele mejor el comportamiento que he descrito? Por ahora, he solucionado el problema cambiando las líneas 23 y 25 del caso "this.api" a "any", y esto cierra el compilador de TypeScript. Pero me gustaría saber cómo modelar correctamente este problema.

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

0

El primer error se debe a que Javascript/Typescript no admite el uso de operadores de distribución en los parámetros, a menos que su función esté configurada para hacerlo.

Tienes que configurar la función para aceptar parámetros variados.

 interface ApiInterface { apiMethod0(thisObj: Object, ...args: any[]): void apiMethod1(thisObj: Object, ...args: [string]): void apiMethod2(thisObj: Object, ...args: [number, boolean]): void }

Ver este código en el patio de recreo

El segundo error se debe a que todos los métodos deben tener la misma "forma" o tener el mismo número de parámetros. En este caso matamos a los dos pájaros con el mismo tiro.

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!