Tslint: Aviso: A regra 'nenhuma variável não utilizada' requer mensagem de verificação de tipo ...

Criado em 16 jun. 2017  ·  46Comentários  ·  Fonte: palantir/tslint

Relatório de erro

com configuração tslint.json :

{
  "rulesDirectory": [
    "node_modules/codelyzer"
  ],
  "rules": {
    "arrow-return-shorthand": true,
    "callable-types": true,
    "class-name": true,
    "comment-format": [
      true,
      "check-space"
    ],
    "curly": true,
    "eofline": true,
    "forin": true,
    "import-blacklist": [
      true,
      "rxjs"
    ],
    "import-spacing": true,
    "indent": [
      true,
      "spaces"
    ],
    "interface-over-type-literal": true,
    "label-position": true,
    "max-line-length": [
      true,
      140
    ],
    "member-access": false,
    "member-ordering": [
      true,
      {
        "order": [
          "public-static-field",
          "protected-static-field",
          "public-static-method",
          "protected-static-method"
        ]
      }
    ],
    "no-arg": true,
    "no-bitwise": true,
    "no-console": [
      true,
      "debug",
      "info",
      "time",
      "timeEnd",
      "trace"
    ],
    "no-construct": true,
    "no-debugger": true,
    "no-duplicate-super": true,
    "no-empty": false,
    "no-empty-interface": true,
    "no-eval": true,
    "no-inferrable-types": [
      true,
      "ignore-params"
    ],
    "no-unused-variable": true,
    "no-misused-new": true,
    "no-non-null-assertion": true,
    "no-shadowed-variable": true,
    "no-string-literal": false,
    "no-string-throw": true,
    "no-switch-case-fall-through": true,
    "no-trailing-whitespace": true,
    "no-unnecessary-initializer": true,
    "no-unused-expression": true,
    "no-var-keyword": true,
    "object-literal-sort-keys": false,
    "one-line": [
      true,
      "check-open-brace",
      "check-catch",
      "check-else",
      "check-whitespace"
    ],
    "prefer-const": true,
    "quotemark": [
      true,
      "single"
    ],
    "radix": true,
    "semicolon": [
      "always"
    ],
    "triple-equals": [
      true,
      "allow-null-check"
    ],
    "typedef-whitespace": [
      true,
      {
        "call-signature": "nospace",
        "index-signature": "nospace",
        "parameter": "nospace",
        "property-declaration": "nospace",
        "variable-declaration": "nospace"
      }
    ],
    "typeof-compare": true,
    "unified-signatures": true,
    "variable-name": false,
    "whitespace": [
      true,
      "check-branch",
      "check-decl",
      "check-operator",
      "check-separator",
      "check-type"
    ],
    "directive-selector": [
      true,
      "attribute",
      "app",
      "camelCase"
    ],
    "component-selector": [
      true,
      "element",
      "app",
      "kebab-case"
    ],
    "use-input-property-decorator": true,
    "use-output-property-decorator": true,
    "use-host-property-decorator": true,
    "no-input-rename": true,
    "no-output-rename": true,
    "use-life-cycle-interface": true,
    "use-pipe-transform-interface": true,
    "component-class-suffix": true,
    "directive-class-suffix": true,
    "no-access-missing-member": true,
    "templates-use-public": true,
    "invoke-injectable": true
  }
}

O que exatamente estou fazendo de errado?

  • __TSLint versão__: 5.4.3
  • __TypeScript version__: 2.3.4
  • __Executando TSLint via__: yarn e linha de comando

Comportamento real

Ao executar tslint com os parâmetros abaixo:

tslint --type-check --project tsconfig.json  src/**/*.ts

Eu recebo o seguinte aviso:

Could not find implementations for the following rules specified in the configuration:
    Warning: The 'no-unused-variable' rule requires type checking
Try upgrading TSLint and/or ensuring that you have all necessary custom rules installed.
If TSLint was recently upgraded, you may have old rules configured which need to be cleaned up.

Comportamento esperado

De acordo com a documentação de tslint para fazer a verificação de tipo, tudo que eu preciso fazer é passar --type-check --project tsconfig.json mas não parece funcionar.

Question

Comentários muito úteis

Se você olhar o leiame do VSCode 1.19, verá que há um novo recurso para tratar esta e outras regras como avisos.
Para nós, significa:

  • remova "no-unused-variable" de tslint.json
  • adicione "noUnusedLocals" ao nosso tsconfig.json

Outras regras são deixadas como um exercício para o leitor ;-)

Observe que o tslint é essa extensão, enquanto o tsconfig é o comportamento interno do VSCode.

Todos 46 comentários

Por favor, preencha o modelo de problema. Qual é a aparência do seu tslint.json?

Estou em casa e tentei o mesmo projeto e está funcionando bem. Vou deixar em aberto até chegar ao trabalho na segunda-feira para testar novamente. Pode ser necessário apenas reinstalar meus módulos de nó.

Eu também atualizei para usar o modelo de problema.

Algum tempo depois da atualização do tslint (talvez v4 -> v5), no-unused-variable não estão disponíveis sem --type-check , --project argumentos.

Esta opção é difícil de usar e leva muito tempo até imprimir os resultados depois de atualizados, mas é a opção de fiapos importante e mais usada. existe alguma maneira de usar essas opções sem argumentos superiores?

Algum tempo depois da atualização do tslint (talvez v4 -> v5), no-unused-variable não está disponível sem os argumentos --type-check, --project.

Estou aprovando --projeto com tslint --type-check --project tsconfig.json src/**/*.ts

Não estou tendo esse problema em meu computador doméstico, mas estou com meu computador de trabalho.

@everedifice havia bugs com a implementação da regra, nós quase a descontinuamos (https://github.com/palantir/tslint/issues/1481) e, finalmente, decidimos mantê-la delegando à implementação do compilador de no-unused-variable (isso resolveu a maioria dos bugs). Há muitos tópicos de discussão sobre isso neste repositório que eu encorajo você a conferir, principalmente com links do PR que fez a alteração significativa ( https://github.com/palantir/tslint/pull/2235.

@mastrauckas Eu realmente não posso te ajudar sem mais detalhes sobre as diferenças entre seus dois ambientes diferentes.

@adidahiya Eu estava recebendo isso em um terceiro computador que é um macOS ontem à noite também. Vou tentar novamente no meu computador doméstico para ver se ainda acontece.

Em geral:
computador 1: Windows 10 completamente atualizado e agora não estou recebendo o error .
computador 2: macOS completamente atualizado e recebo o error .
computador 3: Windows 7 completamente atualizado e recebo o error .

@everedifice Acabei de publicar uma nova versão de tslint-consistent-codestyle com uma nova regra no-unused que é principalmente como no-unused-variable com alguns recursos adicionais, mas sem a necessidade de usar --project --type-check .

Se estiver interessado, você pode encontrar a documentação aqui: https://github.com/ajafff/tslint-consistent-codestyle/blob/master/docs/no-unused.md

O computador que eu pensei que não estava apresentando o problema parece ter o problema afinal. Isso é um inseto?

Alguma novidade sobre esse assunto?

Estou tendo o mesmo problema.

O mesmo problema, mas com ambos 'Aviso: a regra' nenhuma variável não utilizada 'requer informações de tipo.'
e 'Aviso: a regra' não usar antes de declarar 'requer informações de tipo.' (Eu posso ver que o erro de digitação em 'informações' foi corrigido entre a versão 5.5.0 e 5.7.0, mas essa foi a única coisa que mudou). Estou executando com o texto datilografado versão 2.4.1. Alguma notícia sobre esse problema?

Mesmo problema aqui

Este problema foi resolvido ou alguma correção temporária para interromper a exibição de avisos.

Não acho que esteja consertado. Eu nem acho que eles aceitaram como um problema.

Correção permanente, use no-unused-variable em tsconfig.json em vez de tslint.json. Se o compilador pode fornecer a mesma funcionalidade, não faz sentido fazê-lo com um linter.

@AnimaMundi bem, ele fornece a mesma funcionalidade, no entanto, ao executar o tslint como parte do nosso processo de CI, eles precisam ser sinalizados durante o teste, não durante a construção. Não concordo que isso deva ser ignorado / removido porque o compilador faz isso em tempo de compilação.

@haswalt Não vejo nenhuma razão para ele precisar ser sinalizado durante a fase de linting em vez da fase de construção. De qualquer forma, não importa se você concorda comigo ou não, não tenho nada a ver com o desenvolvimento desse projeto. Acabei de ver que alguém estava procurando uma solução e forneceu-lhe isso.

Semelhante à correção de noUnusedLocals e noUnusedParameters no meu tsconfig.json. Erros aparecem no painel "problemas".

@AnimaMundi @haswalt @keego os méritos de uma regra de lint vs. uma verificação do compilador para vars não utilizados foram discutidos extensivamente em outros threads do TSLint (https://github.com/palantir/tslint/issues/1481 e threads vinculados); este problema não é realmente o lugar para isso.

@adidahiya, meu comentário pretendia apenas compartilhar uma correção para esse problema, não fornecer comentários sobre os méritos das regras do linter versus verificações do compilador.

Adiar para o compilador não faz a mesma coisa: o compilador tem apenas uma opção: FALHA.
A razão para tslint lidar com isso é que geralmente precisa ser um aviso (rabisco verde vs vermelho).

não apenas os problemas de tslint podem ser mostrados como avisos, mas também podem ser ignorados de forma isolada, enquanto os erros de compilação de texto digitado não podem ser

Esses pontos já foram todos eliminados (veja meu último comentário e os tópicos vinculados). Não há nada que o impeça de usar no-unused-variable como uma regra TSLint agora. Não tenho certeza do que esses comentários de acompanhamento estão tentando alcançar.

@mastrauckas você ainda está tendo problemas com esta regra? O sinalizador --type-check tornou-se obsoleto, mas --project é necessário para habilitar as regras baseadas na verificação de tipo.

Além: com o TS 2.6 , você pode usar // @ts-ignore para suprimir erros do compilador.

@adidahiya Eu estava apenas respondendo aos comentários acima que afirmam que não há razão para ter isso como uma regra lint em vez de uma regra do compilador.

mas você está certo, acho que o problema relevante é com a extensão vscode e não o tslint em si. tbh havia tantos problemas nesse tópico que demorei um pouco para descobrir exatamente por que não estava funcionando e onde.

agradeço a dica. irei voltar a usar a configuração do compilador assim que mudarmos para 2.6

Outro ponto para aqueles que afirmam que isso não deve ser uma regra de fiapos: avisos de fiapos podem ser corrigidos, e este é um dos principais candidatos para isso.

Estou recebendo o mesmo aviso no último código do VS 1.19 The 'no-unused-variable' rule requires type information com isso (veja abaixo). Minha configuração está faltando alguma coisa?

{
  "extends": "tslint:recommended",
  "rules": {
    "linebreak-style": [true, "LF"],
    "quotemark": [true, "single", "avoid-escape", "avoid-template"],
    "no-console": false,
    "no-unused-expression": false,
    "ordered-imports": false,
    "member-access": [true, "no-public"],
    "object-literal-sort-keys": false,
    "curly": [true, "ignore-same-line"],
    "semicolon": [true, "never"],
    "no-var-requires": false,
    "no-unused-variable": true
  }
}

Se você olhar o leiame do VSCode 1.19, verá que há um novo recurso para tratar esta e outras regras como avisos.
Para nós, significa:

  • remova "no-unused-variable" de tslint.json
  • adicione "noUnusedLocals" ao nosso tsconfig.json

Outras regras são deixadas como um exercício para o leitor ;-)

Observe que o tslint é essa extensão, enquanto o tsconfig é o comportamento interno do VSCode.

Optei por remover no-unused-variable porque o VS 1.19 parece já reportar isso.

Não entendo o que VSCode tem a ver com isso. Não é suficiente ter apenas o VSCode tratando isso como avisos, eu preciso que a construção do meu servidor de desenvolvimento webpack não falhe por causa deles. Existe um substituto para no-unused-variable que, independente de editores específicos, irá

  • ser tratado como um aviso durante o desenvolvimento
  • falha nas compilações durante CI

?

@pelotom , várias pessoas foram redirecionadas aqui da extensão VSCode TSLint, por exemplo, de https://github.com/Microsoft/vscode-tslint/issues/219

Até agora, o TS não era capaz de mostrar alguns problemas como avisos (rabiscos verdes), mas os lints (ESlint, TSLint) sim. Então, estávamos perguntando por que o TSlint não relataria variáveis ​​não utilizadas como avisos. Mas a partir de 1.19, o TS do VSCode pode fazer esses avisos e estamos saindo dessa questão 😉

Para ser claro, eu uso o VSCode também e também gostaria de ver esses avisos destacados no editor, mas as configurações do VSCode parecem ser a camada errada para _configurar_ a gravidade dos erros do compilador, uma vez que não afeta o resto do seu conjunto de ferramentas.

Eu concordo com você, Tom, e espero que a solução seja encontrada onde tanto o editor quanto nossos procedimentos de construção / CI tenham o suporte adequado. Até agora, vimos uma forte resistência (aparentemente justificada) e alguns (incluindo eu) tomariam o que pudéssemos, hoje, mantendo a esperança de uma solução real.

Se você olhar o leiame do VSCode 1.19, verá que há um novo recurso para tratar esta e outras regras como avisos.

@rnemec Acho que você quis escrever "notas de lançamento" em vez de "leia-me". Fui estúpido o suficiente para procurar o readme. E para quem chega aqui, podemos também citar a parte relevante:

O VS Code agora exibe problemas de estilo de código TypeScript como avisos em vez de erros. Isso se aplica á:

A variável é declarada, mas nunca usada
A propriedade é declarada, mas seu valor nunca é lido
Código inacessível detectado
Etiqueta não utilizada
Caso no interruptor
Nem todos os caminhos de código retornam um valor
Tratá-los como avisos é consistente com outras ferramentas, como o TSLint. Eles ainda serão exibidos como erros ao executar o tsc na linha de comando.

Você pode desativar esse comportamento definindo: "typescript.reportStyleChecksAsWarnings": false.

Portanto, esta é uma solução temporária e só funcionaria ao usar o VSCode. Qualquer outra ferramenta de construção usando tsc diretamente não compilaria o código se os avisos fossem deixados lá. Tenho alguns colegas que estão usando Atom, então eles não conseguirão compilar o código se eu fizer alterações e ignorar um dos avisos. Direito?

Não entendo muito bem como isso resolve alguma coisa. Como exibir essas coisas como avisos é útil se o compilador ainda os trata como erros?

E, se bem entendi, a solução a longo prazo seria adicionar um sinalizador para impor o mesmo comportamento em tsc (fazendo com que seja compilado com avisos) ou remover essas verificações do compilador completamente?

--- editar ---
Não li todos os comentários anteriores. @pelotom já estava

Se você quiser que as verificações de lint tenham gravidades diferentes no modo dev e no modo CI, você pode fazer isso com várias configurações tslint.json, onde uma extends a outra. # 2569 precisa ser corrigido para que a UX aqui seja boa, de modo que você possa alternar a gravidade com apenas uma linha de configuração defaultSeverity - está em andamento.

@adidahiya, o que está sendo discutido é uma suposta _reposição_ para a regra no-unused-variable lint, usando tsc noUnusedLocals .

@pelotom certo, entendi - mas não acho que tsc suporte esse fluxo de trabalho ainda. Você poderia ter dois arquivos tsconfig.json onde um estende o outro e desativa cada verificação do compilador "não fatal" (neste caso, noUnusedLocals , noUnusedParameters ) individualmente, mas isso não não permite que você veja as verificações como avisos em seu editor.

@adidahiya sim, é por isso que não é uma substituição válida atualmente. E eu prefiro muito mais ver no-unused-variable feito para funcionar corretamente no VSCode do que investir mais esforço fazendo com que noUnusedLocals se comporte mais como uma regra de fiapos. IMO, foi um erro do compilador tentar se apropriar desse tipo de verificação em primeiro lugar.

E eu prefiro muito mais ver nenhuma variável não usada feita para funcionar corretamente no VSCode do que investir mais esforço para fazer com que noUnusedLocals se comporte mais como uma regra de lint.

Faz sentido. Eu acredito que este projeto visa fazer isso: https://github.com/angelozerr/tslint-language-service. Você pode usar regras que requerem verificação de tipo com esse plugin.

Eu falei cedo demais. Estamos bloqueados em https://github.com/palantir/tslint/issues/2649 para que o plugin seja útil. Em vez disso, rastreie esse problema.

@adidahiya sim, venho acompanhando isso há algum tempo.

Alguma novidade sobre isso? Será descontinuado ou não?

@ philip-firstorder usando isto corrigiu o problema para mim --project tsconfig.json

tslint -c tslint.json --project tsconfig.json src/**/*.ts

no-unused-variable agora está obsoleto, consulte # 3918 e # 3919

🤖 Beep boop! 👉 TSLint está obsoleto 👈 e você deve mudar para typescript-eslint ! 🤖

🔒 Este problema está sendo bloqueado para evitar novas discussões desnecessárias. Obrigado! 👋

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