Búsqueda de sitios web

¿Está mal ignorar la devolución implícita dentro de una función flecha en JavaScript o TypeScript cuando no se requiere retorno?


Muy a menudo me encuentro con código que se ve algo así:

ngOnDestroy() {
  this.subscriptions.forEach(subscription => subscription.unsubscribe());
}

Mi pregunta es si esto es, aunque inofensivo en este ejemplo, una mala práctica, ya que la implicación aquí es que hay un valor de retorno que es igual a lo que devuelve el método unsubscribe().

El código anterior no necesita devolver nada desde la función flecha, sin embargo, hay un retorno implícito allí, es decir, el cuerpo se traduce en return subscription.unsubscribe().

¿Sería una mejor práctica codificar esa función de la siguiente manera? (nota las llaves adicionales):

ngOnDestroy() {
  this.subscriptions.forEach(subscription => {
    subscription.unsubscribe();
  });
}

Respuesta #1

La función flecha reduce el código que escribes, así que el retorno implícito ayuda a ahorrar algunas pulsaciones de tecla :) Sin embargo, en tu segundo ejemplo, incluso hay un retorno que es undefined. Así que no es una mala práctica, es más limpio y más corto.

Respuesta #2

Es una cuestión de estilo, pero yo llamaría a la devolución implícita no intencionada algo malo. Requiere un poco menos de tecleo, pero da una impresión equivocada sobre la API en uso si un desarrollador que lee el código no está familiarizado con ella. Esto es menos problemático para APIs bien conocidas como forEach. Aun así, si una función devuelve un valor pero se ignora, esto puede causar confusión.

El retorno implícito no causará problemas en tiempo de ejecución si el valor devuelto es undefined, pero en caso de que esté definido, un valor puede afectar el código donde se llama a una función de esa manera.

Un ejemplo es una trampa en la que caí accidentalmente una vez con las pruebas de AngularJS. Los módulos de prueba aceptan funciones de configuración de módulos con las mismas firmas que los módulos de producción (una función anotada para inyección de dependencias que no devuelve ningún valor), pero el valor simplemente se ignora en el módulo de producción:

// ok
app.config((foo) => foo.barThatReturnsAValue());

Mientras que en las pruebas resulta en un error oscuro:

// Error: [ng:areq] Argument 'fn' is not a function, got Object    
angular.mock.module((foo) => foo.barThatReturnsAValue())

El problema que es específico de TypeScript es que tales problemas usualmente no son detectados por las verificaciones de tipo:

let foo = () => 1;
let bar = (foo: () => void) => {};

bar(foo); // ok

Artículos relacionados