Tslint: no-unused-variable TypeError: Não é possível ler a propriedade '1' de nulo

Criado em 17 mai. 2018  ·  14Comentários  ·  Fonte: palantir/tslint

Relatório de erro

  • __TSLint version__: 5.10.0
  • __TypeScript version__: 2.8.1
  • __ Executando TSLint via__: CLI

Código TypeScript sendo vinculado

import { A, B, C } from './file';

console.log('No imports used');

export const D = 4;

com configuração tslint.json :

{
  "rules": {
    "no-unused-variable": [true, {"ignore-pattern": "^_"}]
  }
}

Comportamento real

The 'no-unused-variable' rule threw an error in '/Users/andrew.mitchell/Documents/Projects/test/test.ts':
TypeError: Cannot read property '1' of null
    at walk (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/rules/noUnusedVariableRule.js:105:54)
    at Rule.AbstractRule.applyWithFunction (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/language/rule/abstractRule.js:39:9)
    at Rule.applyWithProgram (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/rules/noUnusedVariableRule.js:32:21)
    at Linter.applyRule (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:194:29)
    at /Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:139:85
    at Object.flatMap (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/utils.js:151:29)
    at Linter.getAllFailures (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:139:32)
    at Linter.lint (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:99:33)
    at /Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/runner.js:209:32
    at step (/Users/andrew.mitchell/Documents/test/node_modules/tslint/node_modules/tslib/tslib.js:133:27)

Comportamento esperado

A regra deve avisar All imports in import declaration are unused. para a linha 1.

Isso é causado por noUnusedVariableRule.ts # L123 porque a mensagem failure é All imports in import declaration are unused. , que não possui um nome de variável para a regex localizar.

Esta regra funciona corretamente se a opção ignore-pattern não for especificada, pois não tentará verificar o nome da variável.

Fixed Bug

Comentários muito úteis

Definir noUnusedLocals e noUnusedParameters em compilerOptions não é exatamente o mesmo que no-unused-variable tslint. A partir de agora, vars não utilizados travam a compilação ou permanecem despercebidos e não há mais modo de aviso 😞

Todos 14 comentários

Bom encontrar @hotforfeature. Comecei a abordar isso em https://github.com/palantir/tslint/pull/3919 porque estava relacionado a algumas mudanças que ocorrerão no TS 2.9 que só irão agravar o problema.

Meu PR evita que uma exceção seja lançada, no entanto, ele simplesmente ignora ignorePattern nos casos que você mencionou, o que não é ótimo. Acredito que precisaremos adicionar algum código complexo, como o que fazemos para autofixes de importação agora: /

Estou me perguntando se devemos descartar essa regra. O tsc agora fornece uma maneira de ignorar seus avisos e oferece suporte para correções automáticas de seus avisos por meio de um IDE.

Pelo que posso ver, o principal benefício dessa regra é ignore-pattern , mas é difícil implementar isso corretamente da maneira como a regra agora está escrita para depender do diagnóstico tsc. O TSLint também é um pouco mais flexível do que o tsc no que diz respeito a desabilitar regras em certos arquivos. @suchanlee alguma opinião sobre tudo isso? Eu sei que você corrigiu esta regra recentemente

Meu principal caso de uso para essa regra é corrigir automaticamente os problemas de commit em um git hook durante o lint. Portanto, ainda acho que há um grande valor aqui, mesmo que o tsc ofereça algo por meio de integrações IDE.

@JKillian, acho que a regra está começando a ficar cada vez mais cara para suportar com o suporte do TSLint para várias versões do Typescript e mudanças contínuas no comportamento do Typescript. E como o Typescript oferece suporte ao recurso, devemos nos inclinar a usá-lo. Mas como as versões anteriores do TS não o suportam, não acho que devemos excluí-lo. No entanto, acho que devemos começar a pensar em descontinuar a regra e trabalhar com o pessoal do TS para oferecer melhor suporte aos fluxos de trabalho TSLint atuais com o TS.

Eu apoiaria a proposta de

@hotforfeature - confirme seu caso de uso e considere-o razoável. No entanto, devido à complexidade da regra, acho que vamos descontinuá-la (consulte # 3919).

Como sempre, qualquer pessoa é bem-vinda para copiar o código-fonte da regra e movê-lo para um pacote externo e continuar usando / melhorando dessa forma!

Por que vale a pena:

{
  "compilerOptions":  {
    "noUnusedLocals": true,
    "noUnusedParameters": true,
  }
}

Usar o acima em tsconfig permite que a regra no-unused-variable lint seja desabilitada.

no-unused-variable agora está obsoleto, e compilerOptions acima é a solução oficial agora.

Definir noUnusedLocals e noUnusedParameters em compilerOptions não é exatamente o mesmo que no-unused-variable tslint. A partir de agora, vars não utilizados travam a compilação ou permanecem despercebidos e não há mais modo de aviso 😞

@giladgray , @killtheliterate escreveu:

Usar o comando acima em tsconfig permite que a regra de lint de variável não utilizada seja desabilitada.

Eu não quero desabilitar esta regra, porque como @kachkaev escreveu

Definir noUnusedLocals e noUnusedParameters em compilerOptions não é exatamente o mesmo que no-unused-variable tslint

Meu caso de uso é o código gerado. Eu quero que meu código escrito manualmente siga esta regra, mas para evitar tornar o gerador de código extremamente complexo, eu gostaria de desabilitar essa regra no código gerado (ou pelo menos em algumas seções do código gerado) - isso é o que pode ' pode ser feito com as opções do compilador TypeScript 😞

No mínimo, essa suspensão de uso deve ser documentada no plenamente que essa suspensão de uso foi prematura. Algum plano para reconsiderar? Uma contribuição da comunidade seria aceita?

Essa depreciação é ridícula. Os sinalizadores do compilador são uma substituição TERRÍVEL. Eles quebram a construção e não se consertam. Como essa é uma solução razoável para apontar as pessoas? Se a opção ignore-pattern for muito difícil de fazer funcionar agora, desative-a.

👋 pessoal - apenas vinculando isso a https://github.com/palantir/tslint/issues/4232. É bem entendido e aceito que as opções do compilador embutido _não_ são uma substituição suficiente para no-unused-variable . A implementação original da regra não funcionou bem com outras ferramentas de TS e teve que ser desativada. # 4232 rastreia encontrar uma maneira de habilitá-lo novamente.

Nesse ínterim, você pode usar algo como tsc --noEmit --noUnusedLocals --noUnusedParameters como uma ferramenta separada para usar as verificações integradas. Sim, isso não é tão bom quanto no-unused-variables configurável.

continue a discussão em # 4100 e # 4232

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