Tslint: a propagação de objetos não deve ser preferida quando o primeiro argumento de Object.assign é uma instância de classe

Criado em 25 mai. 2017  ·  3Comentários  ·  Fonte: palantir/tslint

Relatório de erro

  • __TSLint versão__: 5.3

Código TypeScript sendo vinculado

value = Object.assign(new Model(), value)

com prefer-object-spread habilitado

Comportamento real

falha de lint, correção automática para usar propagação de objeto

Comportamento esperado

nada. esta regra deve ignorar casos onde o primeiro argumento para Object.assign é uma instância de classe.

  • se --project é fornecido, podemos verificar se o tipo do primeiro argumento é semelhante a uma classe
  • se nenhum projeto for fornecido e estivermos apenas fazendo verificações sintáticas, o melhor que podemos fazer é verificar se há new ... e ignorar a expressão

conforme relatado em https://github.com/palantir/tslint/issues/2618#issuecomment -303879255

Fixed Bug

Comentários muito úteis

Se o primeiro argumento não for um literal de objeto, a regra só produzirá um erro se o resultado for atribuído a algo.
Atribuir o valor de retorno de Object.assign apenas faz sentido se o primeiro argumento for CallExpression, NewExpression ou semelhante. Todo o resto, por exemplo, um Identifier ou PropertyAccessExpression ainda deve ser um erro.
E isso não requer o verificador de tipo.

Todos 3 comentários

Object.assign tem efeitos colaterais em seu primeiro argumento. (É por isso que o TypeScript transpila { ...x, ...y } em Object.assign({}, x, y) .) A regra só deve ser ativada se o primeiro argumento for um literal de objeto novo.

A regra só deve ser ativada se o primeiro argumento for um literal de objeto novo.

Bem, tecnicamente, você está certo. Mas frequentemente vejo erros em que os programadores não são cuidadosos sobre os efeitos colaterais no primeiro argumento e fornecem um valor não literal de qualquer maneira quando eles _realmente_ pretendiam fazer a mesma coisa que a propagação do objeto. Então, eu ainda gostaria que essa regra capturasse isso. Talvez pudesse ser opt-in ...

Se o primeiro argumento não for um literal de objeto, a regra só produzirá um erro se o resultado for atribuído a algo.
Atribuir o valor de retorno de Object.assign apenas faz sentido se o primeiro argumento for CallExpression, NewExpression ou semelhante. Todo o resto, por exemplo, um Identifier ou PropertyAccessExpression ainda deve ser um erro.
E isso não requer o verificador de tipo.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

ghost picture ghost  ·  3Comentários

Ne-Ne picture Ne-Ne  ·  3Comentários

jamesarosen picture jamesarosen  ·  3Comentários

DanielKucal picture DanielKucal  ·  3Comentários

mrand01 picture mrand01  ·  3Comentários