Tslint: moment.js๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 11์›” 11์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: palantir/tslint

๋ฒ„๊ทธ ์‹ ๊ณ 

  • __TSLint ๋ฒ„์ „__: 5.8.0
  • __TypeScript ๋ฒ„์ „__: 2.6.1
  • ____๋ฅผ ํ†ตํ•ด TSLint ์‹คํ–‰ํ•˜๊ธฐ: (ํ•˜๋‚˜ ์„ ํƒ) CLI

๋ฆฐํŠธ๋˜๋Š” TypeScript ์ฝ”๋“œ

import * as moment from 'moment';
import { logger } from './utils/logger';

const x: moment.Moment = moment();

logger.info(x.toString());

tslint.json ๊ตฌ์„ฑ:

{
    "extends": ["tslint:all", "tslint-eslint-rules", "tslint-config-prettier"],
    "rules": {
        "completed-docs": [false],
        "member-ordering": [
            true,
            {
                "order": [
                    "public-static-field",
                    "protected-static-field",
                    "private-static-field",
                    "public-instance-field",
                    "private-instance-field",
                    "public-constructor",
                    "protected-constructor",
                    "private-constructor",
                    "public-static-method",
                    "protected-static-method",
                    "private-static-method",
                    "public-instance-method",
                    "private-instance-method"
                ]
            }
        ],
        "no-implicit-dependencies": false,
        "no-inferrable-types": false,
        "no-null-keyword": false,
        "prettier": [
            true,
            {
                "bracketSpacing": true,
                "jsxBracketSameLine": false,
                "parser": "typescript",
                "printWidth": 120,
                "semi": true,
                "singleQuote": true,
                "tabWidth": 4,
                "trailingComma": "all",
                "useTabs": false
            }
        ],
        "variable-name": [true, "allow-leading-underscore", "allow-pascal-case", "ban-keywords", "check-format"]
    },
    "rulesDirectory": ["tslint-plugin-prettier"]
}

์‹ค์ œ ํ–‰๋™

๋ณด๊ณ ๋œ ์˜ค๋ฅ˜:

/Users/mrandolph/Projects/***/***/src/server/test.ts
ERROR: 4:26   no-unsafe-any  Unsafe use of expression of type 'any'.
ERROR: 6:13   no-unsafe-any  Unsafe use of expression of type 'any'.

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

moment.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Šฅ๋ ฅ. ํ˜„์žฌ tslint๋Š” any ์œ ํ˜•์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋Š” linting ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•˜๋ฉด ์—ฌ์ „ํžˆ ๋™์ผํ•œ no-unsafe-any ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

import { duration, Duration } from 'moment';
import { logger } from './utils/logger';

const x: Duration = duration(1, 'week');

logger.info(x.toString());

์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

/Users/mrandolph/Projects/***/***/src/server/test.ts
ERROR: 4:21   no-unsafe-any  Unsafe use of expression of type 'any'.
ERROR: 6:13   no-unsafe-any  Unsafe use of expression of type 'any'.

์ฃผ์˜ ์‚ฌํ•ญ - .d.ts ํŒŒ์ผ์ด ์ˆœ๊ฐ„์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. @types์—์„œ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Duplicate

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Lint ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ --noUnusedLocals ๋ฐ --noUnusedParameters ๋Œ€์‹  ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • tslint๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ๋Š” no-unused-variable ์—†์ด ์‹คํ–‰ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” no-unused-variable ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€์‹  ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๊ทœ์น™์„ https://github.com/ajafff/tslint-consistent-codestyle/blob/master/docs/no-unused.md ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐœ์ธ ๊ตฌ์„ฑ์›์„ ๊ฐ์ง€ํ•˜์ง€ ์•Š์Œ).

์ด๊ฒƒ์ด ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ์ˆœ๊ฐ„์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด์œ ๋Š” - ์ž˜ ๊ฐ€์ ธ์˜ค๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์—‡์ด ์ž˜๋ชป๋˜๊ณ  ์™œ ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€๋Š” ์•„๋ฌด๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทœ์น™์€ ์–ด๋–ป๊ฒŒ ๋“  typescript์˜ ๋‚ด๋ถ€๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

์ฃผ์˜ ์‚ฌํ•ญ - .d.ts ํŒŒ์ผ์ด ์ˆœ๊ฐ„์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. @types์—์„œ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ œ ์ฒซ ์งˆ๋ฌธ์ด์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค.

tslint:all ๋Š” no-unused-variable ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ทœ์น™์€ ๋‹ค๋ฅธ ์œ ํ˜• ๊ฒ€์‚ฌ ๊ทœ์น™์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. #2736
no-unused-variable ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์ง€๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

no-unused-variable์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์ง€๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ no-unused-variable ๋„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ์ˆœ๊ฐ„์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด์œ ๋Š” - ์ž˜ ๊ฐ€์ ธ์˜ค๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Lint ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ --noUnusedLocals ๋ฐ --noUnusedParameters ๋Œ€์‹  ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • tslint๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ๋Š” no-unused-variable ์—†์ด ์‹คํ–‰ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” no-unused-variable ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€์‹  ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๊ทœ์น™์„ https://github.com/ajafff/tslint-consistent-codestyle/blob/master/docs/no-unused.md ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐœ์ธ ๊ตฌ์„ฑ์›์„ ๊ฐ์ง€ํ•˜์ง€ ์•Š์Œ).

์ด๊ฒƒ์ด ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ์ˆœ๊ฐ„์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด์œ ๋Š” - ์ž˜ ๊ฐ€์ ธ์˜ค๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์—‡์ด ์ž˜๋ชป๋˜๊ณ  ์™œ ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€๋Š” ์•„๋ฌด๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทœ์น™์€ ์–ด๋–ป๊ฒŒ ๋“  typescript์˜ ๋‚ด๋ถ€๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰