Tslint: Aucune variable inutilisée pour l'alias de type et l'interface lorsqu'elle est utilisée comme générique.

Créé le 2 avr. 2017  ·  24Commentaires  ·  Source: palantir/tslint

Rapport d'erreur

  • __TSLint version__ : 5.0.0
  • __TypeScript version__ : 2.2.2
  • __Exécution de TSLint via__ : CLI

Code TypeScript en train d'être lint

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 },
            });
        });
    });
});

avec la configuration 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,}"]
    }
}

Comportement réel

Il marque l'alias de type et l'interface comme inutilisés.

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 |         }

Comportement prévisible

L'alias de type et l'interface sont utilisés comme arguments génériques et ne doivent pas comporter d'erreurs de charpie.

P1 Requires Type Checker Fixed Bug

Commentaire le plus utile

Nous vivons encore cela aussi. Voici un dépôt minimal (le plus petit que je puisse trouver):

box.ts :

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

box_holder.ts :

import { Box } from './box';

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

Résultat:

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

Versions :

  • tslint: 5.1.0
  • tapuscrit: 2.3.0

Tous les 24 commentaires

Ressemble à Microsoft/TypeScript#14953

Mon code effectue une vérification de type, il ne semble donc pas s'agir d'une erreur Typescript. Comme "solution de contournement", j'ai "noUnusedLocals" et "noUnusedParameters" activés dans tsconfig, et no-unused-variable désactivés.

Dans ce fichier

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));
}

J'obtiens ces erreurs :

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.

Il semble que tslint pense que les variables dans les génériques ne sont pas utilisées.

C'est assez ennuyeux car je ne peux pas supprimer les importations. Pour l'instant, je dois désactiver l'option de vérification des variables inutilisées.

Je ne pense pas que ce soit https://github.com/Microsoft/TypeScript/issues/14953. @joscha a produit une reproduction propre dans https://github.com/palantir/tslint/issues/2621 où les importations ne sont pas rompues (https://gist.github.com/joscha/6633bae73fb4b143cfb685b2754259c9). Priorité à cela.

Dans ce cas, il y a toujours l'importation de React (non illustré). Si vous utilisez declare namespace React { class Component<T, U> {} } place, l'erreur disparaît.

Je rencontre toujours ce problème et no-unused-variable est toujours inutilisable dans tslint 5. Je suis heureux de vous aider en fournissant des exemples.

Nous vivons encore cela aussi. Voici un dépôt minimal (le plus petit que je puisse trouver):

box.ts :

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

box_holder.ts :

import { Box } from './box';

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

Résultat:

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

Versions :

  • tslint: 5.1.0
  • tapuscrit: 2.3.0

Fait intéressant, il semble que le nom du module d'importation compte. En prenant l'exemple ci-dessus avec box_holder.ts important de box.ts , en renommant box_holder.ts en quelques noms différents, donne :

bo.ts : erreur
bo_.ts : erreur
bow.ts : erreur
box_.ts : erreur
box_holder.ts : erreur
boxa.ts : pas d'erreur
boy.ts : pas d'erreur
bx.ts : pas d'erreur

Je suis venu ici pour ça. Je reçois tout un tas de nouvelles erreurs de charpie du type :

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.

Tous ces éléments ne sont _pas_ utilisés en tant que variables, mais plutôt des définitions de _type_.

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

export declare interface AppState {
  auth: AuthState;
}

Cela devrait être corrigé dans typescript@next maintenant. Pourriez-vous tous le tester ?

Toujours le même problème sur [email protected]
Utilisation de [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()));
    }
}

corrigé dans TS 2.4

Je vois ceci sans erreur dans tsc :

interface SurveyAssetLayersProxyProps {
  survey: Survey
}

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

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

@mikew Peut-être que votre tslint fonctionne avec une version TypeScript différente de votre tsc ?

Je ne savais pas que c'était possible. Les deux sont relatifs au projet, en ./node_modules/.bin/ . Comment ferais-je pour confirmer cela?

Le 2 juin 2017, à 14h52, Andy [email protected] a écrit :

@mikew https://github.com/mikew Peut-être que votre tslint fonctionne avec une version TypeScript différente de celle de votre tsc ?

-
Vous recevez ceci parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub https://github.com/palantir/tslint/issues/2470#issuecomment-305864709 , ou coupez le fil de discussion https://github.com/notifications/unsubscribe-auth/AAASeRvhBbEUpy0tQwk_wtObSYT9bsndgaC5s

Utiliser un autre tsc dans tslint n'est pas vraiment possible... @mikew quelle version exacte de 2.4 nightly utilisez-vous ?

@adidahiya pour le moment, cela ne fonctionne pas parce que vous ne mettez à niveau les deps que dans devDependencies mais pas dans peerDependencies . voir ici https://github.com/palantir/tslint/blob/3323ed2b0824a12c8b35c421ebf23c7d17cf788f/package.json#L51. J'espère obtenir la version du correctif dès que possible :sourire:

Ooh, j'ai essayé de supprimer et de réinstaller tslint. Et son tapuscrit imbriqué disparu. Quelque chose ne va pas avec le fil.

je rencontre ce problème avec la v5.6.0

@tolgaek Pourriez-vous fournir un exemple de code ? Quelle est ta version TS ? Pouvez-vous reproduire votre erreur en utilisant l'option de compilation --noUnusedLocals au lieu de tslint ?

salut @andy-ms J'essayais de recréer ce problème avec un code simple mais l'erreur ne s'afficherait pas alors. Il semble que cette erreur soit due à la complexité de notre application.

De plus, je ne pouvais pas exécuter avec noUnusedLocals mais j'obtiens l'erreur " error: unknown option `--noUnusedLocals'".

Voici le code sur lequel je vois l'erreur :

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));
  }
}

Dans le fichier ci-dessus, j'obtiens **.ts[8, 3]: 'Response' is declared but never used. même si Response est utilisé pour taper la valeur de retour de la fonction request

Je vois cela avec tslint 5.10.0 et tapuscrit 2.9.2. Des idées?

Bip boop ! 👉 TSLint est obsolète 👈 et vous devriez passer à typescript-eslint ! ??

🔒 Ce problème est verrouillé pour éviter d'autres discussions inutiles. Merci! ??

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

dashmug picture dashmug  ·  3Commentaires

Ne-Ne picture Ne-Ne  ·  3Commentaires

ypresto picture ypresto  ·  3Commentaires

DanielKucal picture DanielKucal  ·  3Commentaires

cateyes99 picture cateyes99  ·  3Commentaires