You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何优化TypedEvent解构,直接获取args属性?

简化InstallationPreparedEvent的属性访问

背景

第三方库提供了以下类型定义:

export interface Event extends Log {
    args?: Result;
}

export interface TypedEvent<EventArgs extends Result> extends Event {
  args: EventArgs;
}

export type InstallationPreparedEvent = TypedEvent<
[
   string,
   string
] & {
   sender: string;
   permissions : string;
}
>;

我写了这样一个函数:

function prepareInstall(...): Promise<InstallationPreparedEvent> {
   const event = ...;
   return event;
}

现有问题

现在要获取args里的属性,不管用哪种写法都很啰嗦——毕竟args里有8个属性,每次都得套一层args:

// 方案1
async function run() {
   const event = await prepareInstall();
   const sender = event.args.sender;
}

// 方案2
async function run() {
   const { args: { sender } } = await prepareInstall();
}

// 方案3
async function run() {
   const { sender } = (await prepareInstall()).args;
}

我想要的效果

想直接这么用,不用再写args:

const { sender } = await prepareInstall();

但直接让prepareInstall返回event.args的话,TypeScript没法正确提示属性;而且我还得让prepareInstall的返回类型保持InstallationPreparedEvent,同时调用时能看到sender、permissions这些属性的提示。

解决办法

最优解:修改返回类型为InstallationPreparedEvent['args']

直接改prepareInstall的返回类型,让它返回event.args,这样TypeScript就能准确识别所有属性:

function prepareInstall(...): Promise<InstallationPreparedEvent['args']> {
   const event = ...;
   return event.args;
}

// 调用时直接解构,提示全正常
async function run() {
   const { sender, permissions } = await prepareInstall();
}

次选:封装工具函数(不修改原函数)

如果不能改原prepareInstall的返回类型,就写个小工具函数提取args:

function getInstallArgs(event: InstallationPreparedEvent) {
  return event.args;
}

// 调用方式
async function run() {
   const { sender, permissions } = getInstallArgs(await prepareInstall());
}

不推荐:用类型断言

要是非得保留原返回类型,也能用类型断言,但这会丢失类型安全性,不建议这么干:

async function run() {
   const { sender, permissions } = (await prepareInstall()).args as InstallationPreparedEvent['args'];
}

内容的提问来源于stack exchange,提问作者Giorgi Lagidze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:16:07