我在使用类型记录的类型系统来建模从Lua调用到TypeScript的通用接口时遇到了困难。为此,开发人员必须定义一个TypeScript接口,定义Lua可以调用的TypeScript方法。细节在这里并不重要,下面的简单例子说明了我的困惑。

正如您从上面的代码中看到的,我有"ApiInterface",它定义了开发人员可能希望从Lua调用的任意方法。所有这些方法都使用一个对象(类似于“this”)的第一个参数,其余的参数可以是开发人员需要从Lua传递到TypeScript方法的任何参数。实际上,这些剩馀的参数所支持的唯一类型是数字、字符串、布尔、null等原语。在上面的示例代码中,我定义了3个这样的API方法,但是开发人员可以定义他们想要的任何方法。这个模块的全部要点是通用的,而不是与"ApiInterface“的任何特定定义联系在一起。
运行时最终将方法调用打包到一个ApiCall类型的对象中,您可以看到该对象是用方法名称的字段、用于"this“的JavaScript对象以及剩余的任意参数定义的。
为了说明我的困惑,我展示了一个KeyofDemo来说明我所得到的TypeScript错误。KeyofDemo类中有一个"run“方法,它希望接受ApiCall对象并调用相应的TypeScript/JavaScript函数。
在这两种情况下,您都可以看到实际调用该方法时的红色。一种情况是没有额外的参数(除了所需的“这个”参数之外),另一种情况是,当ApiCall.args实际上填充了一个参数数组从Lua传递到TypeScript时。
第一个红色的错误消息是:A spread argument must either have a tuple type or be passed to a rest parameter。
第二个红色的错误消息是:Expected 3 arguments but got 1。
这些错误信息对我来说都没有任何意义。如果我试图编译上述TypeScript代码,编译器将报告类似的错误。
我怎样才能让打字稿的类型系统最好地模拟我所描述的行为?目前,我通过将第23和第25行改为"this.api“改为"any”来解决这个问题,这就关闭了TypeScript编译器。但我想知道如何正确地模拟这个问题。
发布于 2022-03-21 08:41:33
第一个错误是因为Javascript/Typescript不支持在参数中使用spread,除非您的函数被配置为这样做。
您必须配置该函数以接受各种参数。
interface ApiInterface {
apiMethod0(thisObj: Object, ...args: any[]): void
apiMethod1(thisObj: Object, ...args: [string]): void
apiMethod2(thisObj: Object, ...args: [number, boolean]): void
}第二个错误是因为方法必须是相同的“形状”,或者具有相同的#参数。在这种情况下,我们用同一块石头杀死了两只鸟。
https://stackoverflow.com/questions/71542622
复制相似问题