Immer modifies `readonly` properties of nested instances that are not immerable
Los mantenedores suelen responder en 4 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Necesita aclaración
- Estado de actividad
- Estancado
- Stack tecnológico
- javascript, typescript
- Área
- tooling
Línea de trabajo
Empieza por la reproducción de CodeSandbox enlazada e inspecciona el manejo existente de las instancias de clase no immerable y del tipado readonly. Se considera terminado cuando el caso Address anidado se rechaza de forma coherente, con cobertura de regresión para el comportamiento en runtime y/o de tipos; el issue no elige entre esos resultados.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
🐛 Bug Report
immer allows modification of readonly properties of nested class instances that are not marked as immerable. This seems dangerous to me. Just like immer does not allow direct modification of class instances that are not marked as immerable, an exception should be thrown. Even better, the types should not allow this.
import { immerable, produce } from "immer";
class Address {
constructor(public readonly streetName: string) {
this.streetName = streetName;
}
}
class ImmerableAddress {
[immerable] = true;
constructor(public readonly streetName: string) {
this.streetName = streetName;
}
}
class ImmerablePerson {
[immerable] = true;
constructor(public readonly address: Address) {
this.address = address;
}
}
describe("immer", () => {
const immerableAddress = new ImmerableAddress("foo");
it("works fine with immerable nested class instance", () => {
const produced = produce(new ImmerablePerson(immerableAddress), (draft) => {
draft.address.streetName = "bar";
});
expect(produced.address.streetName).toBe("bar");
expect(produced.address).toBeInstanceOf(ImmerableAddress);
expect(produced.address).not.toBe(immerableAddress);
});
const address = new Address("foo");
it("allows illegal modification of non-immerable nested class instance", () => {
const produced = produce(new ImmerablePerson(address), (draft) => {
draft.address.streetName = "bar"; // works unexpectedly
});
expect(produced.address.streetName).toBe("bar");
expect(produced.address).toBeInstanceOf(Address);
expect(produced.address).toBe(address);
});
});
Link to repro
Environment
Immer 10.1.1
- Lenguaje dominante
- JavaScript
- Estrellas
- 29k
- Forks
- 905
- Merge medio
- 3 d 16 h
- PR fusionados (30 d)
- 22
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de immerjs/immer
-
Shrinking an array with `length =` and growing it back loses the patches for the truncated indicesPosiblemente ocupada @RClaudiuM la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 4 días
-
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
Los mantenedores suelen responder en 4 días
-
Docs: Chinese (zh-CN) website translation is outdated vs English docsQuizá libre de nuevo @lijiayou0728 la tomó hace 91 días y no hay ningún pull request abierto. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
immerjs/immer#1242 · 5 comentarios ·
Los mantenedores suelen responder en 4 días
-
Branding Drafts on Type levelAbiertoquestion
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
Los mantenedores suelen responder en 4 días
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
immerjs/immer#1217 · 1 comentario ·
Los mantenedores suelen responder en 4 días
Todos los issues de immerjs/immer
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Automattic/node-canvas#2633 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
capricorn86/happy-dom#2594 ·
Los mantenedores suelen responder en 1 día
-
Decoding tag 1 (epoch date) with an 8-byte integer throws "Cannot mix BigInt and other types"Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
microsoft/monaco-editor#5575 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
Los mantenedores suelen responder en 1 día