Tslint: Ninguna variable no utilizada para el alias de tipo y la interfaz cuando se utilizan como genéricos.

Creado en 2 abr. 2017  ·  24Comentarios  ·  Fuente: palantir/tslint

Informe de error

  • __TSLint versión__: 5.0.0
  • __TypeScript versión__: 2.2.2
  • __Ejecutando TSLint vía__: CLI

El código de TypeScript está ligado

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

con tslint.json configuración:

{
    "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,}"]
    }
}

Comportamiento real

Marca el alias de tipo y la interfaz como no 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 |         }

Comportamiento esperado

El alias de tipo y la interfaz se utilizan como argumentos genéricos y no deben tener errores de pelusa.

P1 Requires Type Checker Fixed Bug

Comentario más útil

Todavía estamos experimentando esto también. Aquí hay un repositorio mínimo (el más pequeño que puedo 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.

Versiones:

  • tslint: 5.1.0
  • mecanografiado: 2.3.0

Todos 24 comentarios

Parece Microsoft / TypeScript # 14953

Mi código realiza una comprobación de tipo, por lo que no parece ser un error de TypeScript. Como "solución alternativa", tengo "noUnusedLocals" y "noUnusedParameters" activados en tsconfig, y no-unused-variable desactivados.

En este archivo

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

Recibo estos errores:

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 piensa que las variables en genéricos no se utilizan.

Esto es bastante molesto porque no puedo eliminar las importaciones. Por ahora tengo que deshabilitar la opción para verificar las variables no utilizadas.

No creo que esto sea https://github.com/Microsoft/TypeScript/issues/14953. @joscha produjo una reproducción limpia en https://github.com/palantir/tslint/issues/2621 donde las importaciones no están rotas (https://gist.github.com/joscha/6633bae73fb4b143cfb685b2754259c9). Dar prioridad a esto.

En ese caso, todavía existe la importación de React (no se muestra). Si usa declare namespace React { class Component<T, U> {} } lugar, el error desaparece.

Sigo experimentando este problema y no-unused-variable aún no se puede utilizar en tslint 5. Me complace ayudar proporcionando ejemplos.

Todavía estamos experimentando esto también. Aquí hay un repositorio mínimo (el más pequeño que puedo 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.

Versiones:

  • tslint: 5.1.0
  • mecanografiado: 2.3.0

Curiosamente, parece que el nombre del módulo de importación importa. Tomando el ejemplo anterior con box_holder.ts importando desde box.ts , cambiando el nombre de box_holder.ts a algunos nombres diferentes, se obtiene:

bo.ts : error
bo_.ts : error
bow.ts : error
box_.ts : error
box_holder.ts : error
boxa.ts : sin error
boy.ts : sin error
bx.ts : sin error

Vine aquí para esto. Recibo un montón de nuevos errores de pelusa en la línea 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 ellos _no_ se utilizan como variables, sino como definiciones de _tipo_.

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

export declare interface AppState {
  auth: AuthState;
}

Esto debería arreglarse en typescript@next ahora. ¿Podrían probarlo todos?

Sigo experimentando el mismo problema en [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()));
    }
}

arreglado en TS 2.4

Veo esto sin un error en tsc :

interface SurveyAssetLayersProxyProps {
  survey: Survey
}

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

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

@mikew ¿ Quizás su tslint está ejecutando con una versión de TypeScript diferente a su tsc ?

No sabía que era posible. Ambos son relativos al proyecto, en ./node_modules/.bin/ . ¿Cómo puedo confirmar esto?

El 2 de junio de 2017, a las 2:52 p.m., Andy [email protected] escribió:

@mikew https://github.com/mikew ¿ Quizás su tslint se esté ejecutando con una versión de TypeScript diferente a la de su tsc?

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub https://github.com/palantir/tslint/issues/2470#issuecomment-305864709 , o silencia el hilo https://github.com/notifications/unsubscribe-auth/AAASeRvhBbEUpy0tQwk_wtObSYT9bsndksgaws3spA .

Usar un tsc en tslint no es realmente posible ... @mikew ¿ qué versión exacta de 2.4 por la noche estás usando?

@adidahiya por ahora, no funciona porque ustedes solo actualizan los departamentos en devDependencies pero no en peerDependencies . ver aquí https://github.com/palantir/tslint/blob/3323ed2b0824a12c8b35c421ebf23c7d17cf788f/package.json#L51. Espero obtener el lanzamiento del parche lo antes posible: sonrisa:

Ooh, intenté quitar y reinstalar tslint. Y su texto mecanografiado anidado desapareció. Algo anda mal con el hilo.

estoy experimentando este problema con v5.6.0

@tolgaek ¿Podría proporcionar un código de muestra? ¿Cuál es tu versión de TS? ¿Puede reproducir su error usando la opción del compilador --noUnusedLocals lugar de tslint?

hola @ andy-ms Estaba tratando de recrear este problema con un código simple, pero el error no aparecía en ese momento. Parece que este error podría deberse a la complejidad de nuestra aplicación de alguna manera.

Además, no pude ejecutar con noUnusedLocals pero obtengo el error "error: opción desconocida '--noUnusedLocals'".

Aquí está el código en el que veo el error:

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

En el archivo anterior, obtengo **.ts[8, 3]: 'Response' is declared but never used. Aunque Response se usa para escribir el valor de retorno de la función request

Estoy viendo esto con tslint 5.10.0 y mecanografiado 2.9.2. ¿Algunas ideas?

🤖 ¡Bip boop! 👉 TSLint está obsoleto 👈 ¡y debería cambiar a mecanografiado-eslint ! 🤖

🔒 Este tema se está bloqueando para evitar más discusiones innecesarias. ¡Gracias! 👋

¿Fue útil esta página
0 / 5 - 0 calificaciones