JavaScript 能否简写直接返回 await 解构的响应指定字段
关于got异步接口提取字段的简写方案
- 你目前写的
getURLsShorthand是完全不符合预期的。解构赋值作为表达式运行时,返回值是赋值运算符右侧的完整源值,也就是await got(options)拿到的全量响应对象(包含headers、statusCode等一堆无关字段),根本不是你解构出来的那几个URL字段。 - 常规写法的冗余点确实存在:需要把要提取的字段名,在嵌套解构时写一遍,组装返回对象时再写一遍,字段多了重复成本很高。
小提示:如果你的got请求配置了
responseType: 'json',body字段已经是解析完成的对象,下面所有写法都可以直接复用。
可落地的实现方案
1. 无临时变量的正确隐式返回写法
如果就是不想定义解构的临时常量,完全可以用嵌套匿名函数把解构和返回逻辑包起来,直接传请求结果进去,全程无临时变量、只发一次请求:
const getURLs = async () => ( ({ body: { shortURL, longURL, iOSLink, androidLink, macOSLink, windowsLink, ubuntuLink } }) => ({ shortURL, longURL, iOSLink, androidLink, macOSLink, windowsLink, ubuntuLink }))(await got(options)) )
逻辑拆解:
- 外层括号是箭头函数的隐式返回包裹
- 中间的匿名函数接收完整响应作为参数,直接在参数位置完成嵌套解构
- 函数内部用解构出来的变量组装要返回的对象
- 最后把
await got(options)的请求结果直接传给这个匿名函数即可
2. 完全消除重复字段名的写法
如果字段数量很多,不想重复写两遍字段名,可以把需要提取的字段列表抽成常量,配合Object.fromEntries自动组装返回对象,字段只需要声明一次:
// 仅声明一次需要提取的字段 const REQUIRED_FIELDS = ['shortURL', 'longURL', 'iOSLink', 'androidLink', 'macOSLink', 'windowsLink', 'ubuntuLink']; // 无临时变量的隐式返回版本 const getURLs = async () => ( (res) => Object.fromEntries(REQUIRED_FIELDS.map(key => [key, res.body[key]]))(await got(options)) )
这个写法后续如果要增删字段,只需要改REQUIRED_FIELDS数组即可,不用改两处逻辑。
3. 可读性优先的折中方案(更推荐)
其实强行写无临时变量的隐式返回,后续加默认值、异常处理或者字段转换的时候会很难扩展,大部分团队的代码规范反而会推荐用带明确解构的常规写法,虽然要写两遍字段名,但一眼就能看清楚返回的字段是什么,维护成本更低:
const getURLs = async () => { const { body: { shortURL, longURL, iOSLink, androidLink, macOSLink, windowsLink, ubuntuLink } } = await got(options); return { shortURL, longURL, iOSLink, androidLink, macOSLink, windowsLink, ubuntuLink, } }
如果要优化这种写法的冗余,也可以分场景处理:
- 若
body里只有少数几个不需要的字段:可以用对象解构的剩余运算符过滤,只挑出不要的字段排除,剩下的全部返回,不用重复罗列字段名:
const getURLs = async () => { const { body: { debugInfo, timestamp, ...requiredURLs } } = await got(options); return requiredURLs; }
- 若
body里有大量无关字段,只需要少数几个指定字段:还是推荐用前面提过的字段列表+Object.fromEntries的白名单方式,不用手动维护排除列表。
内容的提问来源于stack exchange,提问作者mattorp
相关产品推荐
相关产品推荐

