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
相关产品推荐
相关产品推荐

