Unexpected undefined not assigned

Aberta
#1,160 2 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 4 dias

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
3/5
Tempo estimado
1-2 dias
Facilidade para iniciantes
45/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Estagnada
Stack de tecnologia
javascript, typescript

Direção de pesquisa

Comece executando a reprodução em TypeScript com produceWithPatches e inspecione os caminhos de implementação percorridos por ela para atribuições herdadas de um protótipo. Compare os patches gerados e o comportamento das propriedades próprias com a saída esperada; considera-se concluído quando atribuir undefined cria uma propriedade própria e um patch add sem alterar o objeto original.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

🐛 Bug Report

When I assign "undefined" to the prop "foo" of draft, and the prototype of base has the prop "foo" which is "undefined",
the final return value is not assigned an "undefined" to the prop "foo".

To Reproduce

import { enablePatches, immerable, produceWithPatches } from "immer";

const proto = { [immerable]: true, name: undefined };
const foo = Object.create(proto);

console.log(`[hasOwnProp] foo:`, Object.prototype.hasOwnProperty.call(foo, "name"));

enablePatches();
const [foo_next, patches, _] = produceWithPatches(foo, (x) => {
  console.log(`[immer] produce foo_next from immer`);
  x.name = undefined;
});

console.log(`[immer] foo_next patches:`, patches);

console.log(`[hasOwnProp] foo:`, Object.prototype.hasOwnProperty.call(foo, "name"));
console.log(`[hasOwnProp] foo_next:`, Object.prototype.hasOwnProperty.call(foo_next, "name"));

foo.name = undefined;
console.log(`[vanilla] assign name manually`);
console.log(`[hasOwnProp] foo:`, Object.prototype.hasOwnProperty.call(foo, "name"));

Observed behavior

[hasOwnProp] foo: false
[immer] produce foo_next from immer
[immer] foo_next patches: []
[hasOwnProp] foo: false
[hasOwnProp] foo_next: false
[vanilla] assign name manually
[hasOwnProp] foo: true

Expected behavior

[hasOwnProp] foo: false
[immer] produce foo_next from immer
[immer] foo_next patches: [
  {
    op: "add",
    path: [ "name" ],
    value: undefined,
  }
]
[hasOwnProp] foo: false
[hasOwnProp] foo_next: true
[vanilla] assign name manually
[hasOwnProp] foo: true
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

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de immerjs/immer

Todas as issues de immerjs/immer

Issues semelhantes

Mais issues de JavaScript

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.