Tslint: Nenhuma variável não usada para alias de tipo e interface quando usada como genérica.

Criado em 2 abr. 2017  ·  24Comentários  ·  Fonte: palantir/tslint

Relatório de erro

  • __TSLint versão__: 5.0.0
  • __TypeScript version__: 2.2.2
  • __ Executando TSLint via__: CLI

Código TypeScript sendo vinculado

describe('Action', () => {
    describe('actionCreator', () => {
        type DummyActionType = 'FOO' | 'BAR';

        interface Point {
            readonly x: number;
            readonly y: number;
        }

        it('creates the correct FSA for primitives', () => {
            const creator = actionCreator<DummyActionType, number>('FOO');
            creator(7).should.deep.equal({ type: 'FOO', payload: 7 });
        });

        it('creates the correct FSA for objects', () => {
            const creator = actionCreator<DummyActionType, Point>('BAR');
            creator({ x: 1, y: 3 }).should.deep.equal({
                type: 'BAR',
                payload: { x: 1, y: 3 },
            });
        });
    });
});

com configuração tslint.json :

{
    "defaultSeverity": "error",
    "extends": [
        // "tslint-microsoft-contrib",
        "tslint:recommended",
        "tslint-react"
    ],

    "rulesDirectory": [
        "./node_modules/tslint-immutable/rules"
    ],

    // additional rules aside from inherited ones
    "rules": {
        "arrow-parens": [true, "ban-single-arg-parens"],

        // possible errors (core TSLint)
        "no-switch-case-fall-through": true,
        "no-string-throw": true,

        // stylistic (core TSLint)
        "array-type": [true, "array"],
        "interface-name": [true, "never-prefix"],
        "no-null-keyword": true,
        "no-require-imports": true,
        "object-literal-sort-keys": false,
        "ordered-imports": [false], // array makes VSCode happy
        "quotemark": [true, "single", "jsx-double", "avoid-escape"],

        // best practices (core TSLint)
        "linebreak-style": [true, "LF"],
        "max-file-line-count": [true, 300],
        "max-line-length": [true, 100],
        "no-magic-numbers": true,
        "no-unused-expression": true,
        "no-unused-variable": [true, "check-parameters", "react"],
        "one-line": [false],
        "prefer-const": true,

        // functional programming
        "no-let": true, // no-var on by default
        "no-this": true,
        "no-class": true,
        "no-new": false, // records?
        "readonly-interface": true,
        "readonly-indexer": true,
        "readonly-array": true,
        "no-mixed-interface": true,

        // react
        "jsx-no-multiline-js": false,

        // legal
        "file-header": [true, "[+ ]{10,}"]
    }
}

Comportamento real

Ele marca o alias de tipo e a interface como não utilizados.

src/frontend/actions/Action.test.ts
'DummyActionType' is declared but never used. (no-unused-variable)
  15 | describe('Action', () => {
  16 |     describe('actionCreator', () => {
> 17 |         type DummyActionType = 'FOO' | 'BAR';
     |             ^
  18 | 
  19 |         interface Point {
  20 |             readonly x: number;

'Point' is declared but never used. (no-unused-variable)
  17 |         type DummyActionType = 'FOO' | 'BAR';
  18 | 
> 19 |         interface Point {
     |                  ^
  20 |             readonly x: number;
  21 |             readonly y: number;
  22 |         }

Comportamento esperado

O alias de tipo e a interface são usados ​​como argumentos genéricos e não devem ter erros de lint.

P1 Requires Type Checker Fixed Bug

Comentários muito úteis

Ainda estamos passando por isso também. Aqui está um repositório mínimo (o menor que posso encontrar):

box.ts:

export class Box<T> {
  value: T;
}

box_holder.ts:

import { Box } from './box';

export class BoxHolder<T> {
  box: Box<T>;
}

Resultado:

ERROR: src/base/tests/box_holder.ts[3, 24]: 'T' is declared but never used.

Versões:

  • tslint: 5.1.0
  • datilografado: 2.3.0

Todos 24 comentários

Parece com Microsoft / TypeScript # 14953

Meu código faz verificação de tipo, portanto, não parece ser um erro de Typecript. Como uma "solução alternativa", tenho "noUnusedLocals" e "noUnusedParameters" ativados no tsconfig e no-unused-variable desativados.

Neste arquivo

import {buildModel} from '../src/compile/common';
import {FacetModel} from '../src/compile/facet';
import {LayerModel} from '../src/compile/layer';
import {Model} from '../src/compile/model';
import {UnitModel} from '../src/compile/unit';
import {initConfig} from '../src/config';
import {ExtendedSpec, FacetSpec, LayerSpec, normalize, TopLevel, UnitSpec} from '../src/spec';

export function parseModel(inputSpec: TopLevel<ExtendedSpec>): Model {
  const spec = normalize(inputSpec);
  return buildModel(spec, null, '', initConfig(inputSpec.config));
}

export function parseUnitModel(spec: TopLevel<UnitSpec>) {
  return new UnitModel(spec, null, '', initConfig(spec.config));
}

export function parseLayerModel(spec: TopLevel<LayerSpec>) {
  return new LayerModel(spec, null, '', initConfig(spec.config));
}

export function parseFacetModel(spec: TopLevel<FacetSpec>) {
  return new FacetModel(spec, null, '', initConfig(spec.config));
}

Eu recebo estes erros:

ERROR: test/util.ts[7, 9]: 'ExtendedSpec' is declared but never used.
ERROR: test/util.ts[7, 23]: 'FacetSpec' is declared but never used.
ERROR: test/util.ts[7, 34]: 'LayerSpec' is declared but never used.
ERROR: test/util.ts[7, 66]: 'UnitSpec' is declared but never used.

Parece que tslint pensa que variáveis ​​em genéricos não são usadas.

Isso é muito chato porque não consigo remover as importações. Por enquanto, tenho que desabilitar a opção de verificar variáveis ​​não utilizadas.

Não acho que seja https://github.com/Microsoft/TypeScript/issues/14953. @joscha produziu uma reprodução limpa em https://github.com/palantir/tslint/issues/2621 onde as importações não foram interrompidas (https://gist.github.com/joscha/6633bae73fb4b143cfb685b2754259c9). Superando a prioridade nisso.

Nesse caso ainda há a importação de React (não mostrado). Se você usar declare namespace React { class Component<T, U> {} } vez disso, o erro desaparecerá.

Ainda estou tendo esse problema e no-unused-variable ainda não pode ser usado no tslint 5. Fico feliz em ajudar, fornecendo exemplos.

Ainda estamos passando por isso também. Aqui está um repositório mínimo (o menor que posso encontrar):

box.ts:

export class Box<T> {
  value: T;
}

box_holder.ts:

import { Box } from './box';

export class BoxHolder<T> {
  box: Box<T>;
}

Resultado:

ERROR: src/base/tests/box_holder.ts[3, 24]: 'T' is declared but never used.

Versões:

  • tslint: 5.1.0
  • datilografado: 2.3.0

Curiosamente, parece que o nome do módulo de importação é importante. Tomando o exemplo acima com box_holder.ts importando de box.ts , renomeando box_holder.ts para alguns nomes diferentes, resulta:

bo.ts : erro
bo_.ts : erro
bow.ts : erro
box_.ts : erro
box_holder.ts : erro
boxa.ts : nenhum erro
boy.ts : nenhum erro
bx.ts : nenhum erro

Vim aqui para isso. Estou recebendo um monte de novos erros de lint nas linhas de:

ERROR: src/app/app-state.ts[1, 1]: All imports are unused.
ERROR: src/app/app.component.ts[2, 15]: 'Platform' is declared but never used.
ERROR: src/auth/auth.service.ts[2, 10]: 'Http' is declared but never used.

Todos esses _não_ estão sendo usados ​​como variáveis, mas sim definições de _tipo_.

import { AuthState } from '../auth/models/auth-state'; // <-- "All imports are unused"

export declare interface AppState {
  auth: AuthState;
}

Isso deve ser corrigido em typescript@next agora. Vocês podem testar?

Ainda tendo o mesmo problema em [email protected]
Usando [email protected]

import * as TypeMoq from 'typemoq';
import { MockedMethod } from '../mocking';
import { IComponent } from '../component';  // <-- All imports are unused
import { IComponentFactory } from '../componentfactory';

export class CreateComponentXMethodMock extends MockedMethod<IComponentFactory, IComponent> {
    constructor(mock: TypeMoq.IMock<IComponentFactory>) {
        super(mock, x => x.createComponentX(TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAnyNumber()));
    }
}

fixado em TS 2.4

Estou vendo isso sem um erro em tsc :

interface SurveyAssetLayersProxyProps {
  survey: Survey
}

export default class SurveyAssetLayersControl extends React.Component<SurveyAssetLayersProxyProps, void> {
}

Me dá: ERROR: 19:11 no-unused-variable 'SurveyAssetLayersProxyProps' is declared but never used.

@mikew Talvez seu tslint esteja sendo executado com uma versão TypeScript diferente de seu tsc ?

Eu não sabia que isso era possível. Ambos são relativos ao projeto, em ./node_modules/.bin/ . Como eu faria para confirmar isso?

Em 2 de junho de 2017, às 14h52, Andy [email protected] escreveu:

@mikew https://github.com/mikew Talvez seu tslint esteja sendo executado com uma versão TypeScript diferente do seu tsc?

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub https://github.com/palantir/tslint/issues/2470#issuecomment-305864709 ou desative a conversa https://github.com/notifications/unsubscribe-auth/AAASeRvhBwsEUpy0tQwk_wtObSYT9Zbs4Ms3Jp .

Usar um tsc em tslint não é realmente possível ... @mikew qual versão exata do 2.4 noturno você está usando?

@adidahiya por enquanto, não funciona porque vocês só atualizam os deps em devDependencies mas não em peerDependencies . veja aqui https://github.com/palantir/tslint/blob/3323ed2b0824a12c8b35c421ebf23c7d17cf788f/package.json#L51. Espero obter o lançamento do patch o mais rápido possível: sorria:

Ooh, tentei remover e reinstalar o tslint. E seu texto datilografado aninhado desapareceu. Alguma coisa errada com fio.

estou tendo esse problema com a v5.6.0

@tolgaek Você poderia fornecer um código de exemplo? Qual é a sua versão do TS? Você pode reproduzir seu erro usando a opção de compilador --noUnusedLocals vez de tslint?

oi @ andy-ms Eu estava tentando recriar esse problema com um código simples, mas o erro não apareceu. Parece que esse erro pode ser devido à complexidade do nosso aplicativo de alguma forma.

Além disso, não consegui executar com noUnusedLocals mas recebo o erro "error: unknown option` --noUnusedLocals '".

Aqui está o código em que vejo o erro:

import { StepUpProvider } from './step-up.provider';
import { Injectable } from '@angular/core';
import {
  Http,
  XHRBackend,
  RequestOptions,
  RequestOptionsArgs,
  Response,
  Request
} from '@angular/http';
import { Observable } from 'rxjs';

@Injectable()
export class RequestInterceptor extends Http {

  constructor(
    public backend: XHRBackend,
    public defaultOptions: RequestOptions,
    private stepUpProvider: StepUpProvider
  ) {
    super(backend, defaultOptions);
  }

  request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    return this.stepUpProvider.intercept(super.request.bind(this, url, options));
  }
}

No arquivo acima, recebo **.ts[8, 3]: 'Response' is declared but never used. Mesmo que Response seja usado para digitar o valor de retorno da função request

Estou vendo isso com tslint 5.10.0 e datilografado 2.9.2. Alguma ideia?

🤖 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