首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用TypeScript“键”创建通用API接口的接口?

如何使用TypeScript“键”创建通用API接口的接口?
EN

Stack Overflow用户
提问于 2022-03-19 22:33:04
回答 1查看 138关注 0票数 0

我在使用类型记录的类型系统来建模从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编译器。但我想知道如何正确地模拟这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-21 08:41:33

第一个错误是因为Javascript/Typescript不支持在参数中使用spread,除非您的函数被配置为这样做。

您必须配置该函数以接受各种参数。

代码语言:javascript
复制
interface ApiInterface {
    apiMethod0(thisObj: Object, ...args: any[]): void
    apiMethod1(thisObj: Object, ...args: [string]): void
    apiMethod2(thisObj: Object, ...args: [number, boolean]): void
}

在操场上看到这段代码

第二个错误是因为方法必须是相同的“形状”,或者具有相同的#参数。在这种情况下,我们用同一块石头杀死了两只鸟。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71542622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档