idx: La función existencial
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
En Facebook, a menudo necesitamos acceder a valores profundamente anidados en estructuras de datos obtenidas con GraphQL. Al intentar acceder a estos valores, es común que uno o más campos intermedios sean nulos. Estos campos intermedios pueden ser nulos por diversas razones, desde controles de privacidad fallidos hasta el simple hecho de que null es la forma más flexible de representar errores no fatales.
Desafortunadamente, acceder a estos valores profundamente anidados es actualmente tedioso y verboso.
props.user &&
props.user.friends &&
props.user.friends[0] &&
props.user.friends[0].friends;
Existe una propuesta de ECMAScript para introducir el operador existencial que haría esto mucho más conveniente. Pero hasta que esa propuesta se finalice, queremos una solución que mejore nuestra calidad de vida, mantenga la semántica existente del lenguaje y fomente la seguridad de tipos con Flow.
Creamos una función existencial que llamamos idx.
idx(props, _ => _.user.friends[0].friends);
La invocación en este fragmento de código se comporta de manera similar a la expresión booleana en el fragmento anterior, pero con significativamente menos repetición. La función idx toma exactamente dos argumentos:
-
Cualquier valor, típicamente un objeto o array del cual quieres acceder a un valor anidado.
-
Una función que recibe el primer argumento y accede a un valor anidado en él.
En teoría, la función idx capturará errores que resulten de acceder a propiedades en null o undefined. Si se detecta tal error, devolverá null o undefined. (Puedes ver cómo se implementa esto en idx.js.)
En la práctica, capturar errores en cada acceso a propiedades anidadas es lento, y diferenciar entre tipos específicos de TypeErrors es frágil. Para abordar estas limitaciones, creamos un plugin de Babel que transforma la invocación de idx anterior en la siguiente expresión:
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;
Finalmente, añadimos una declaración de tipo personalizada de Flow para idx que permite verificar correctamente el recorrido en el segundo argumento mientras permite el acceso anidado en propiedades que pueden ser nulas.
La función, el plugin de Babel y la declaración de Flow están ahora disponibles en GitHub. Se utilizan instalando los paquetes npm idx y babel-plugin-idx, y agregando "idx" a la lista de plugins en tu archivo .babelrc.
