Cómo evitar la reasignación sin parámetros al establecer una propiedad en un objeto DOM

4 minutos de lectura

avatar de usuario
Lucas

Tengo un método cuyo objetivo principal es establecer una propiedad en un objeto DOM

function (el) {
  el.expando = {};
}

Uso el estilo de código de AirBnB que hace que ESLint arroje un no-param-reassign error:

error Asignación al parámetro de función ‘el’ no-param-reassign

¿Cómo puedo manipular un objeto DOM pasado como argumento mientras se ajusta el estilo de código de AirBnB?

Alguien sugirió usar /* eslint react/prop-types: 0 */ refiriéndose a otro problema, pero si no me equivoco, esto se aplica bien para reaccionar, pero no para la manipulación nativa de DOM.

Además, no creo que cambiar el estilo del código sea una respuesta. Creo que uno de los beneficios de usar un estilo estándar es tener un código consistente en todos los proyectos y cambiar las reglas a voluntad se siente como un mal uso de un estilo de código principal como el de AirBnB.

Para que conste, le pregunté a AirBnB en GitHub, cuál creen que es el camino a seguir en estos casos en el número 766.

  • No. En primer lugar, eso significaría deshabilitar esto para todas las demás ocurrencias donde esta regla tenga sentido. En segundo lugar, creo que o sigues una guía de estilo o no. Al menos si es una guía de estilo seguida por muchos desarrolladores en todo tipo de proyectos.

    – Lucas

    25 de febrero de 2016 a las 20:48

  • Pero usted está preguntando cómo no para obedecer la guía de estilo, porque estás haciendo lo que está tratando de evitar. En cualquier caso, solo desactívelo para esa función

    – Matemáticas

    25/02/2016 a las 20:51

  • Posible duplicado de ¿Cómo deshabilitar la regla ESLint react/prop-types en un archivo?

    – Matemáticas

    25/02/2016 a las 20:52

  • @Mathletics No, la regla me parece sensata, pero simplemente no funciona para este caso específico. Me preguntaba si hay una manera de hacer esto siguiendo las reglas.

    – Lucas

    25/02/2016 a las 20:54

  • No importa cómo lo exprese, la operación que desea entra en conflicto con la regla. Dicho esto, parece un problema XY; No adjuntaría propiedades directamente a los nodos DOM de esa manera.

    – Matemáticas

    25 de febrero de 2016 a las 20:59

avatar de usuario
sfletch

Como sugiere @Mathletics, puede desactivar la regla completamente agregando esto a su .eslintrc.json expediente:

"rules": {
  "no-param-reassign": 0
}

O podría deshabilitar la regla específicamente para propiedades de parámetro

"rules": {
  "no-param-reassign": [2, { "props": false }]
}

Alternativamente, puede deshabilitar la regla para esa función

/* eslint-disable no-param-reassign */
function (el) {
  el.expando = {};
}
/* eslint-enable no-param-reassign */

O solo para esa linea

function (el) {
  el.expando = {}; // eslint-disable-line no-param-reassign
}

  • Gracias. Parece que la mayoría de las personas encuentran que modificar el linter es la mejor manera de hacerlo. Aplicar esto para una sola línea parece ser la mejor compensación para mí en este momento.

    – Lucas

    26 de febrero de 2016 a las 16:18

  • Eso realmente tiene sentido, es decir, para proyectos express de nodejs, donde a veces es posible que desee modificar res.session inmediatamente

    – David

    1 de agosto de 2016 a las 9:10

  • Si el problema es solo con la configuración de las propiedades de los parámetros de la función como se indica en la pregunta, la respuesta de Gyandeep a continuación es mucho mejor.

    – Prashanth Chandra

    19 de enero de 2017 a las 4:57


  • gracias @hiehiuehue: parece que lo quitaron. eliminando enlace.

    – sfletche

    24 de enero de 2021 a las 18:49

avatar de usuario
Justo Romijn

Él no-param-reassign advertencia tiene sentido para las funciones comunes, pero para un clásico Array.forEach bucle sobre una matriz que tiene la intención de mutar, no es apropiado.

Sin embargo, para evitar esto, también puede usar Array.map con un nuevo objeto (si eres como yo, no te gusta posponer las advertencias con los comentarios):

someArray = someArray.map((_item) => {
    let item = Object.assign({}, _item); // decouple instance
    item.foo = "bar"; // assign a property
    return item; // replace original with new instance
});

avatar de usuario
Llamativo

También puedes usar lodash assignIn que muta el objeto.

assignIn(obj, { someNewObj });

https://lodash.com/docs/4.17.2#assignIn

avatar de usuario
Gyandeep

Puede anular esta regla dentro de su .eslintrc archivo y desactívelo para propiedades de parámetro como este

{
    "rules": {
        "no-param-reassign": [2, { 
            "props": false
        }]
    },
    "extends": "eslint-config-airbnb"
}

De esta forma, la regla sigue activa pero no avisará de las propiedades. Más información: http://eslint.org/docs/rules/no-param-reassign

  • ¿Esta respuesta no está completamente incluida en la aceptada?

    – Dan Dascalescu

    8 de enero de 2018 a las 9:29

  • @DanDascalescu Hay un comentario debajo de la respuesta aceptada que apunta a esta, entonces, ¿quizás se editó en algún momento para ser más completo?

    – Bigsee

    31 de enero de 2019 a las 7:46

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad