JavaScript/TypeScript能否在单条语句中同时保留原变量名与解构赋值
解答
截至2024年,JavaScript 和 TypeScript 均未原生支持你设想的「参数位同时保留原对象引用+解构字段」的语法,你示例中的car & { speed }、rect & { left, top }这类写法不属于现有标准支持的语法,暂时无法直接使用。
现有可替代的实现方案
你目前使用的「单独写解构语句」是所有可行方案中可读性最高、性能最优的写法,即使箭头函数需要额外加块级作用域,也不会带来额外的运行开销,是业内通用的标准写法。
如果确实希望减少代码行数,可以参考以下两种折衷方案:
方案1:使用自执行函数简化箭头函数写法
仅适合逻辑非常简单的场景,可读性略低:
cars.forEach(rect => (({ left, top }) => ({ left, top, intersection: rect.intersect(anotherRect) }))(rect))
方案2:封装通用工具函数
适合需要高频使用这类逻辑的场景:
// 通用工具:传入对象和需要提取的字段,返回原对象+字段的组合 const pickWithOrigin = <T, K extends keyof T>(obj: T, keys: K[]) => { return { origin: obj, ...Object.fromEntries(keys.map(key => [key, obj[key]])) } as { origin: T } & Pick<T, K> } // 使用示例 cars.forEach(rect => { const { origin, left, top } = pickWithOrigin(rect, ['left', 'top']) return { left, top, intersection: origin.intersect(anotherRect) } })
补充说明
目前 TC39 没有相关语法提案进入标准化流程,TypeScript 团队也没有计划在 ECMAScript 标准之外单独支持这类语法,短期内无法通过原生语法实现你设想的写法。
内容的提问来源于stack exchange,提问作者hopeless-programmer
相关产品推荐
相关产品推荐

