Immer modifies `readonly` properties of nested instances that are not immerable
Mantenedores costumam responder em até 4 dias
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
- Tipo de issue
- Bug
- Clareza
- Precisa de esclarecimento
- Status de atividade
- Estagnada
- Stack de tecnologia
- javascript, typescript
- Domínio
- tooling
Direção de pesquisa
Comece pela reprodução vinculada no CodeSandbox e inspecione o tratamento existente de instâncias de classe não immerable e da tipagem readonly. Considera-se concluído quando o caso Address aninhado for rejeitado de forma consistente, com cobertura de regressão para o comportamento em runtime e/ou de tipos; a issue não escolhe entre esses resultados.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
🐛 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
- Linguagem predominante
- JavaScript
- Estrelas
- 29k
- Forks
- 905
- Merge médio
- 3d 16h
- PRs com merge (30d)
- 22
Preparar o ambiente
Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de immerjs/immer
-
Shrinking an array with `length =` and growing it back loses the patches for the truncated indicesTalvez já em andamento @RClaudiuM assumiu há 1 dia. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
Mantenedores costumam responder em até 4 dias
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 35/100
Mantenedores costumam responder em até 4 dias
-
Docs: Chinese (zh-CN) website translation is outdated vs English docsTalvez livre de novo @lijiayou0728 assumiu há 92 dias e não há nenhum pull request aberto. Aberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 55/100
immerjs/immer#1242 · 5 comentários ·
Mantenedores costumam responder em até 4 dias
-
question
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
Mantenedores costumam responder em até 4 dias
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
immerjs/immer#1217 · 1 comentário ·
Mantenedores costumam responder em até 4 dias
Todas as issues de immerjs/immer
Issues semelhantes
-
[docs] RELEASE.md: wrong branch name, no check that the prepare PR merged with the right subject, manual publish stepTalvez já em andamento @albertteoh assumiu hoje. Abertadocumentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
jaegertracing/jaeger-ui#4739 ·
Mantenedores costumam responder em até 1 dia
-
documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
keepassxreboot/keepassxc-browser#3159 · 1 comentário ·
-
Add: ESP 2 RSAbertaapproved check:passed feeds:add
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 67/100
-
v6: OTP input keeps the rest of a selection when you type over itTalvez já em andamento @thejesh23 assumiu hoje. Abertabug confirmed has-pr js v6
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
twbs/bootstrap#43323 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Mantenedores costumam responder em até 1 dia