JavaScript/TypeScript中能否通过解构获取async异步属性?
结论
目前JavaScript与TypeScript均不支持原生解构时自动await异步属性的语法,你示例中const { await x } = a的写法属于未被纳入ECMAScript标准的设想语法,无法在现有运行环境中直接运行。
原因说明
你的示例中类A的getterx返回的是异步函数getX的执行结果,所有异步函数的返回值本质都是Promise实例,因此普通解构拿到的x必然是Promise类型,符合现有语法规则。
现有可行替代方案
方案1:先解构再单独await(最常用)
async function g(a : A) { const { x } = a const xValue = await x console.log(xValue) // 5 }
方案2:解构多个异步属性时搭配Promise.all
如果需要同时解构多个异步属性,用Promise.all批量等待可以优化执行效率:
// 假设a同时有x、y两个异步getter async function g(a : A) { const { x, y } = a const [xVal, yVal] = await Promise.all([x, y]) console.log(xVal, yVal) }
方案3:封装工具函数简化重复代码
如果项目中频繁需要处理异步属性解构,可以自己封装类型安全的工具函数:
async function destructureAsync<T extends object, K extends keyof T>(obj: T, keys: K[]): Promise<{[P in K]: Awaited<T[P]>}> { const result = {} as {[P in K]: Awaited<T[P]>} for (const key of keys) { result[key] = await obj[key] } return result } // 使用示例 async function g(a : A) { const { x } = await destructureAsync(a, ['x']) console.log(x) // 5 }
内容的提问来源于stack exchange,提问作者hopeless-programmer
相关产品推荐
相关产品推荐

