Использование TypeScript и Maquette JSX, но линтер говорит, что jsx не используется

Я использую TypeScript и Maquette для компиляции файлов .tsx. Код правильно компилируется и запускается в браузере, но ESLint недоволен моей функцией, помечая ее как «неиспользуемую переменную».

Я попытался максимально точно имитировать стартовый проект TypeScriptMaquette , но когда я смотрю на этот проект, я не вижу предупреждения линтера. Каким-то образом в стартовом проекте ESLint и TypeScript распознают, что jsx это моя фабричная функция, но в моем проекте, несмотря на то, что мне кажется идентичной конфигурацией, это не так.

Какой у меня недостающий кусок головоломки? Несмотря на то, что я прочитал все документы несколько раз и погуглил всеми возможными способами, я не нашел ничего, что указывало бы на причину проблемы.

badge.tsx

      import { jsx } from "maquette-jsx";
import { VNode } from "maquette";
import Component from "../../core/component";

export default class Badge extends Component {
    init():void {}

    renderVDom():VNode {
        const {
            gc,
            state: { label },
        } = this;

        return (
            <div key={this} class={gc("badge")} title={label}>
                { label }
            </div>
        );
    }
}

Но когда я запускаю eslint ( ./node_modules/.bin/eslint . --ext .json,.js,.ts,.jsx,.tsx) Я получаю следующее предупреждение:

      .../js/components/badge/badge.tsx
  1:10  warning  'jsx' is defined but never used  @typescript-eslint/no-unused-vars

Я включаю свои файлы конфигурации ниже, но это большой проект, поэтому я редактирую части, которые, как мне кажется, не имеют отношения к делу:

package.json

      {
  "name": "...",
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^4.25.0",
    "@typescript-eslint/parser": "^4.25.0",
    "eslint": "7.7.x",
    "maquette-jsx": "^3.0.1",
    "ts-loader": "^8.3.0",
    "typescript": "^4.2.4"
  },
  "dependencies": {
    "maquette": "^3.5.0"
  }
}

tsconfig.json

      {
    "include": [
        "./js/**/*.ts",
        "./js/**/*.tsx"
    ],
    "compilerOptions": {
        "jsx": "react",
        "jsxFactory": "jsx",
        "module": "es6",
        "moduleResolution": "node",
        "noImplicitAny": true,
        "outDir": "./dist/",
        "resolveJsonModule": true,
        "target": "es6",
        "lib": [
            "DOM",
            "ES2020"
        ]
    }
}

.eslintrc.json

      {  
  "env": {
    "browser": true,
    "es6": true
  },
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": 2020,
    "sourceType": "module"
  },
  "plugins": [
    "@typescript-eslint"
  ],
  "extends": [
    "./.typescript.eslintrc.json"
  ]
}

.typescript.eslintrc.json

      {
    "overrides": [
        {
            "files": ["*.ts", "*.tsx"],
            "rules": {
                "@typescript-eslint/no-unused-vars": "warn",

                "no-unused-vars": "off"
            }
        }
    ]
}

1 ответ

Недостающий фрагмент головоломки - это parserOptions.project.

На самом деле, parserOptions.jsxPragma также приемлемо, но поскольку имя фрагмента ("jsx") уже определено в проекте, и линтер может получать другую полезную информацию из файла tsconfig, часто имеет смысл установить project если ты можешь.

      {
  "parserOptions": {
    "ecmaVersion": 2020,
    "sourceType": "module",
    "project": "./tsconfig.json"
  },  
}

Проект указывает ESLint на файл конфигурации TypeScript, который имеет решающее значение для идентификации неявного вызова jsx().

Однако, если связывание вашего tsconfig с вашим eslint приводит к проблемам с производительностью, вы можете уменьшить масштаб и просто использовать jsxPragma:

      {
  "parserOptions": {
    "ecmaVersion": 2020,
    "sourceType": "module",
    "jsxPragma": "jsx"
  },
}

Насколько мне известно, параметры парсера машинописного текста задокументированы только в файле Readme модуля NPM . Вероятно, это записано где-то еще, но быстрый поиск обычных мест ™ не дал подробных документов.

Другие вопросы по тегам