Typescript的这种动态类型查找特性是如何调用的?

yyhrrdl8  于 2023-06-07  发布在  TypeScript
关注(0)|答案(1)|浏览(199)

我刚刚查看了discord.js的源代码(或者更确切地说是类型头),我发现它在这个函数中从一个接口中查找可能的键类型组合:

public on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => Awaitable<void>): this;

界面如下所示:

export interface ClientEvents {
  applicationCommandPermissionsUpdate: [data: ApplicationCommandPermissionsUpdateData];
  autoModerationActionExecution: [autoModerationActionExecution: AutoModerationActionExecution];
  autoModerationRuleCreate: [autoModerationRule: AutoModerationRule];
  autoModerationRuleDelete: [autoModerationRule: AutoModerationRule];
  // ...

因此,基本上它使用K类型在ClientEvents中查找具有适当名称的字段的类型(如果我理解正确的话)。
目前尚不清楚的是如何解释

autoModerationRuleCreate: [autoModerationRule: AutoModerationRule];

部分。更具体地说,元组(???)[autoModerationRule: AutoModerationRule]
这个功能怎么叫?我看了 typescript 的参考资料,但没有找到这个。

mzsu5hc0

mzsu5hc01#

这称为带标签的元组
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-0.html#labeled-tuple-elements
这在处理函数参数时特别有用。
如果你获取了一个函数的参数(这些参数由元组类型表示)并希望保留名称:

declare function a(b:number,c:string):unknown;

type P = Parameters<typeof a>;

这里P的类型是[b: number, c:string],我们可以使用这个元组创建另一个函数,保留参数名:

declare function d(...args:P):number;

...现在,如果我们悬停d,我们将看到它具有匹配a的命名参数。以前,没有标记元组(即<TS v3.something),这些参数名称将丢失。
Playground链接

相关问题