idx:存在函数
·阅读时间:2 分钟
在 Facebook,我们经常需要访问使用 GraphQL 获取的数据结构中的深度嵌套值。在访问这些深度嵌套值的路上,一个或多个中间字段通常是可为空的。这些中间字段可能是由于各种原因为空,从失败的隐私检查到仅仅是空值恰好是表示非致命错误的最灵活方式。
不幸的是,访问这些深度嵌套值目前既繁琐又冗长。
props.user &&
props.user.friends &&
props.user.friends[0] &&
props.user.friends[0].friends;
有一个ECMAScript 提议引入存在运算符,这将使操作更加方便。但在该提议最终确定之前,我们希望找到一个能够改善我们生活质量、保持现有语言语义并鼓励使用 Flow 进行类型安全的解决方案。
我们提出了一个我们称之为 idx
的存在函数。
idx(props, _ => _.user.friends[0].friends);
此代码片段中的调用方式与上面代码片段中的布尔表达式类似,但重复性大大降低。idx
函数恰好接受两个参数
- 任何值,通常是对象或数组,您希望在其中访问嵌套值。
- 一个接收第一个参数并在其上访问嵌套值的函数。
理论上,idx
函数将尝试捕获访问 null 或 undefined 上的属性所导致的错误。如果捕获到此类错误,它将返回 null 或 undefined。(并且您可以在idx.js中看到它是如何实现的。)
在实践中,尝试捕获每个嵌套属性访问速度很慢,并且区分特定类型的 TypeError 很脆弱。为了解决这些缺点,我们创建了一个 Babel 插件,它将上述 idx
调用转换为以下表达式
props.user == null
? props.user
: props.user.friends == null
? props.user.friends
: props.user.friends[0] == null
? props.user.friends[0]
: props.user.friends[0].friends;
最后,我们为 idx
添加了一个自定义 Flow 类型声明,允许在第二个参数中正确地进行类型检查,同时允许在可为空的属性上进行嵌套访问。
该函数、Babel 插件和 Flow 声明现在可在 GitHub 上获取。您可以通过安装 idx 和 babel-plugin-idx npm 包并向 .babelrc
文件中的插件列表中添加“idx”来使用它们。