TypeScript ESLint неправильно сообщает: «Функция определена, но никогда не используется». - PullRequest
2 голосов
/ 26 мая 2020

У меня есть функция iwAddClassAndRemoveInSiblings в lib\iw-browser.ts файле:

"use strict";

/* Adds given CSS class to given element and remove this class in element's siblings.
   Equal to jQuery: $(element1).addClass(CSSClass).siblings().removeClass(CSSClass) */
function iwAddClassAndRemoveInSiblings(element: Element, CSSClass: string): void {
  for (const sibling of element.parentNode.children)
    sibling.classList.remove(CSSClass)
  element.classList.add(CSSClass)
}

Я вызываю эту функцию в lib\iw-carousel\iw-carousel.ts файле:

document.addEventListener('click', (event) => {
  const target = <HTMLElement>event.target
  if (target.matches('.iw-carousel__indicators li'))
    iwCarouselShowSlide(target.closest('.iw-carousel'), Number(target.dataset.slideTo))
})

/* Shows i-th slide of the given iw-carousel. */
const iwCarouselShowSlide = (carousel: HTMLElement, slideIndex: number) => {
  const slides = carousel.querySelectorAll('.iw-carousel__item')
  iwAddClassAndRemoveInSiblings(slides[slideIndex], 'active')
}

Скомпилированные iw-browser.js и iw-carousel.js упоминаются в iw-carousel.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">  
  <script src="lib/iw-carousel/iw-carousel.js"></script>
  <script src="lib/iw-browser.js"></script>
</head>
<body>
   <!-- unimportant html content -->
</body>
</html>

К сожалению, Typescript ESLint неверно сообщает, что функция iwAddClassAndRemoveInSiblings не используется как в Visual Studio Code, так и при запуске из командной строки npx eslint . --ext .ts:

'iwAddClassAndRemoveInSiblings' is defined but never used. eslint(@typescript-eslint/no-unused-vars)

The error in Visual Studio Code

Страница HTML отображается правильно - функция iwAddClassAndRemoveInSiblings запускается без проблем. Visual Studio Code также знает, что используется функция iwAddClassAndRemoveInSiblings. Если я попытаюсь использовать несуществующую функцию, VS C скажет: Cannot find name 'nonExsistingFunction' . Итак, VS C проверяет, определена ли функция. У меня эта проблема только с ESLint.

Я неправильно настроил ESLint или Typescript?

Я установил TypeScript и ESLint способом, описанным на странице: Как использовать конфигурацию ESLint TypeScript Airbnb ?

Файлы конфигурации Typescript и ESLint приведены ниже:

.eslintr c. js:

module.exports = {
  root: true,
  parser: '@typescript-eslint/parser', // allows ESLint to understand TypeScript syntax
  parserOptions: {
    project: ['./tsconfig.json'],      // required for "type-aware linting"
  },
  plugins: [
    '@typescript-eslint',              // allows to use the rules within the codebase
  ],
  extends: [
    'airbnb-typescript/base',          //use Airbnb config
  ],
  rules: { }
};

tsconfig. json:

{
  "compilerOptions": {
    "target": "ES2016",
    "module": "commonjs",
    "sourceMap": true
  }
}

упаковка. json:

{
  "name": "iw-components",
  "version": "0.1.0",
  "description": "...",
  "main": "index.js",
  "directories": {
    "lib": "lib"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/iwis/iw-components.git"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/iwis/iw-components/issues"
  },
  "homepage": "https://github.com/iwis/iw-components#readme",
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^2.34.0",
    "@typescript-eslint/parser": "^2.34.0",
    "eslint": "^6.8.0",
    "eslint-config-airbnb-typescript": "^7.2.1",
    "eslint-config-standard-with-typescript": "^16.0.0",
    "eslint-plugin-import": "^2.20.2",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^4.2.1",
    "eslint-plugin-standard": "^4.0.1",
    "typescript": "~3.7.5"
  }
}

1 Ответ

1 голос
/ 26 мая 2020

Проблема в том, что ESLint не знает, что это глобальная функция. У вас есть два варианта (как минимум):

  1. Не используйте глобальные переменные - глобальные переменные исторически являются источником множества ошибок. Вместо этого используйте модули. Или,
  2. Сообщите ESLint, что это глобальный.

Есть две части # 2: В файле, где определена функция, вам нужно сообщить ESLint, что функция не 't "не используется", и в файле, в котором вы его используете, вам нужно сообщить об этом ESLint.

Подробности см. в документации, но в основном:

  • Чтобы сообщить ESLint, что функция не используется, используйте комментарий , описанный здесь , например:

    /* exported iwAddClassAndRemoveInSiblings */
    
  • Чтобы сообщить ESLint, что он существует (в другом файле) используйте комментарий , описанный здесь , например:

    /* global iwAddClassAndRemoveInSiblings */
    

Но я настоятельно рекомендую вместо этого использовать модули.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...