Tslint: рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЯрд╛рдЗрдк рдЙрдкрдирд╛рдо рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░ рдирд╣реАрдВред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдЕрдкреНрд░реИрд▓ 2017  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: palantir/tslint

рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ

  • __TSLint рд╕рдВрд╕реНрдХрд░рдг__: 5.0.0
  • __рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг__: 2.2.2
  • __TSLint рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ__: CLI

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдкрдВрдХреНрддрд┐рдмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

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

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

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░

рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкреНрд░рдпреБрдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред

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

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░

рдЙрдкрдирд╛рдо рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд▓рд┐рдВрдЯ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

P1 Requires Type Checker Fixed Bug

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рдо рдЕрднреА рднреА рдЗрд╕рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдПрдХ рдиреНрдпреВрдирддрдо рд░реЗрдкреЛ рд╣реИ (рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ):

рдмреЙрдХреНрд╕.рдЯреАрдПрд╕:

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

box_holder.ts:

import { Box } from './box';

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

рдирддреАрдЬрд╛:

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

рд╕рдВрд╕реНрдХрд░рдг:

  • tslint: 5.1.0
  • рдЯрд╛рдЗрдкрдкреНрд░рддрд┐: 2.3.0

рд╕рднреА 24 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ#14953

рдореЗрд░рд╛ рдХреЛрдб рдЯрд╛рдЗрдкрдЪреЗрдХ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред "рд╕рдорд╛рдзрд╛рди" рдХреЗ рд░реВрдк рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ "noUnusedLocals" рдФрд░ "noUnusedParameters" tsconfig рдореЗрдВ рдЪрд╛рд▓реВ рд╣реИ, рдФрд░ no-unused-variable рдмрдВрдж рд╣реИред

рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ

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

рдореБрдЭреЗ рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд╣реИрдВ:

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.

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ tslint рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдХрд╛рдлреА рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЖрдпрд╛рдд рдирд╣реАрдВ рд╣рдЯрд╛ рд╕рдХрддрд╛ред рдЕрднреА рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЕрдкреНрд░рдпреБрдХреНрдд рдЪрд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ https://github.com/Microsoft/TypeScript/issues/14953 рд╣реИред @joscha рдиреЗ https://github.com/palantir/tslint/issues/2621 рдореЗрдВ рдПрдХ рд╕реНрд╡рдЪреНрдЫ рд░реЗрдкреНрд░реЛ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рдЖрдпрд╛рдд рдЯреВрдЯрд╛ рдирд╣реАрдВ рд╣реИ (https://gist.github.com/joscha/6633bae73fb4b143cfb685b2754259c9)ред рдЗрд╕ рдкрд░ рдЙрдЫрд╛рд▓ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ред

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрднреА рднреА React рдХрд╛ рдЖрдпрд╛рдд рд╣реЛрддрд╛ рд╣реИ (рджрд┐рдЦрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛)ред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп declare namespace React { class Component<T, U> {} } рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ no-unused-variable tslint 5 рдореЗрдВ рдЕрднреА рднреА рдЕрдиреБрдкрдпреЛрдЧреА рд╣реИред рдореБрдЭреЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИред

рд╣рдо рдЕрднреА рднреА рдЗрд╕рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдПрдХ рдиреНрдпреВрдирддрдо рд░реЗрдкреЛ рд╣реИ (рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ):

рдмреЙрдХреНрд╕.рдЯреАрдПрд╕:

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

box_holder.ts:

import { Box } from './box';

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

рдирддреАрдЬрд╛:

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

рд╕рдВрд╕реНрдХрд░рдг:

  • tslint: 5.1.0
  • рдЯрд╛рдЗрдкрдкреНрд░рддрд┐: 2.3.0

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ box_holder.ts рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде box.ts , box_holder.ts рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдХреБрдЫ рдЕрд▓рдЧ рдирд╛рдореЛрдВ рд╕реЗ, рдкреИрджрд╛рд╡рд╛рд░:

bo.ts : рддреНрд░реБрдЯрд┐
bo_.ts : рддреНрд░реБрдЯрд┐
bow.ts : рддреНрд░реБрдЯрд┐
box_.ts : рддреНрд░реБрдЯрд┐
box_holder.ts : рддреНрд░реБрдЯрд┐
boxa.ts : рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ
boy.ts : рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ
bx.ts : рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ

рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЖрдП рд╣реИрдВред рдореБрдЭреЗ рдирдИ рд▓рд┐рдВрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕рдореВрд╣ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ:

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.

рд╡реЗ рд╕рднреА _not_ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ _type_ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВред

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

export declare interface AppState {
  auth: AuthState;
}

рдЗрд╕реЗ рдЕрднреА typescript@next рдореЗрдВ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдЖрдк рд╕рдм рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЕрднреА рднреА рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ [email protected]
[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()));
    }
}

рдареАрдХ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рджрд┐рдпрд╛ред https://github.com/Microsoft/TypeScript/issues/14953#issuecomment -302101264

рдЯреАрдПрд╕ 2.4 . рдореЗрдВ рддрдп

рдореИрдВ рдЗрд╕реЗ tsc рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд┐рдирд╛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ:

interface SurveyAssetLayersProxyProps {
  survey: Survey
}

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

рдореБрдЭреЗ рджреЗрддрд╛ рд╣реИ: ERROR: 19:11 no-unused-variable 'SurveyAssetLayersProxyProps' is declared but never used.

@mikew рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ tslint рдЖрдкрдХреЗ tsc рд╕реЗ рднрд┐рдиреНрди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЪрд▓ рд░рд╣рд╛ рд╣реЛ?

рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдерд╛ред рджреЛрдиреЛрдВ ./node_modules/.bin/ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВред рдореИрдВ рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рдЙрдВрдЧрд╛?

2 рдЬреВрди, 2017 рдХреЛ рджреЛрдкрд╣рд░ 2:52 рдмрдЬреЗ, рдПрдВрдбреА рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@mikew https://github.com/mikew рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ tslint рдЖрдкрдХреЗ tsc рд╕реЗ рднрд┐рдиреНрди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЪрд▓ рд░рд╣рд╛ рд╣реЛ?

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ https://github.com/palantir/tslint/issues/2470#issuecomment-305864709 , рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ https://github.com/notifications/unsubscribe-auth/AAASeRvhBbEUpy0tQwk_wtObSYT9bsndks5sAEvCgaw3TObSYT9bsndks5sAEvCgaws .

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЕрд▓рдЧ tsc рдореЗрдВ tslint рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рд╕рдВрднрд╡ ... @mikew рдЬреЛ 2.4 рдХрд╛ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд░рд╛рдд рдХреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@adidahiya рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд▓реЛрдЧ рдХреЗрд╡рд▓ devDependencies deps рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди peerDependencies ред рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ https://github.com/palantir/tslint/blob/3323ed2b0824a12c8b35c421ebf23c7d17cf788f/package.json#L51ред рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдкреИрдЪ рд░рд┐рд▓реАрдЬ рдорд┐рд▓рдиреЗ рдХреА рдЙрдореНрдореАрдж :рдореБрд╕реНрдХрд╛рди:

рдУрд╣, рдореИрдВрдиреЗ tslint рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдФрд░ рдЗрд╕рдХреА рдиреЗрд╕реНрдЯреЗрдб рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓реА рдЧрдИред рдпрд╛рд░реНрди рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИред

рдореИрдВ v5.6.0 . рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

@tolgaek рдХреНрдпрд╛ рдЖрдк рдирдореВрдирд╛ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрдкрдХрд╛ рдЯреАрдПрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк tslint рдХреЗ рдмрдЬрд╛рдп --noUnusedLocals рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╣рд╛рдп @ рдПрдВрдбреА-рдПрдордПрд╕ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рд░рд▓ рдХреЛрдб рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рддрдм рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧреАред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХрд┐рд╕реА рддрд░рд╣ рд╣рдорд╛рд░реЗ рдРрдк рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ noUnusedLocals рд╕рд╛рде рдирд╣реАрдВ рдЪрд▓ рд╕рдХрд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ "рддреНрд░реБрдЯрд┐: рдЕрдЬреНрдЮрд╛рдд рд╡рд┐рдХрд▓реНрдк `--noUnusedLocals'" рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред

рдпрд╣рд╛рдВ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬрд┐рд╕ рдкрд░ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ:

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

рдЙрдкрд░реЛрдХреНрдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдореБрдЭреЗ **.ts[8, 3]: 'Response' is declared but never used. рднрд▓реЗ рд╣реА Response рдХрд╛ рдЙрдкрдпреЛрдЧ request рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕реЗ tslint 5.10.0 рдФрд░ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ 2.9.2 рдХреЗ рд╕рд╛рде рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рдмреАрдк рдмреВрдк! TSLint рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ЁЯСИ рдФрд░ рдЖрдкрдХреЛ typescript-eslint рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП! рдореИрдВ

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЖрдЧреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╢реБрдХреНрд░рд┐рдпрд╛! рдореИрдВ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Ne-Ne picture Ne-Ne  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cretz picture cretz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ypresto picture ypresto  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sumitkmr picture sumitkmr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

allbto picture allbto  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ