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.

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