禁用js项目中的ts错误

Disable ts errors in js project

所以我有一个 cra 应用程序,并且我在 eslint --init 的帮助下设置了一个 .eslintrc.json 配置。外观如下:

{
    "env": {
        "browser": true,
        "es2021": true
    },
    "extends": [
        "plugin:react/recommended",
        "airbnb",
        "prettier"
    ],
    "parserOptions": {
        "ecmaFeatures": {
            "jsx": true
        },
        "ecmaVersion": 12,
        "sourceType": "module"
    },
    "plugins": [
        "react"
    ],
    "rules": {
        "react/jsx-filename-extension": "off"
    }
}

我还有一个 jsconfig.json 文件。据我了解,这是从 tsconfig.json 配置派生的。这是我的样子:

{
  "compilerOptions": {
    "baseUrl": "./<path/to/src>",
    "checkJs": true,
    "jsx": "react"
  },
  "exclude": ["node_modules", "build"]
}

根据我的阅读,如果将 checkJs 设置为 true,您将获得一些功能,例如自动导入,根据我的测试,这是正确的,我喜欢它。但我不喜欢的是我的 js 文件中有 ts 错误,并被推荐将 ts-ignore 添加到文件顶部或特定行。我能做的是将 checkJs 标志设置为 false,这些都会消失,但自动导入等功能也会消失。

我能否将 checkJs 标志保留为 true 并仍然禁用我的 js 项目中的所有 ts 错误?是否有 eslint 规则?据我所知,我需要安装一堆 ts eslint 软件包并更改我的 eslint 配置,但这似乎有点不对劲。这可以用一种稍微优雅的方式完成吗?

我参与了一个 monorepo 项目,该项目使用 TypeScript 仅基于 JSDoc/TSDoc 注释生成类型声明文件(.d.ts 文件)。所以,没有使用真正的 TypeScript 代码,只有特殊注释。

这是其中一个包的合并配置:

{
    "compilerOptions": {
        "target": "ESNext",
        "module": "ESNext",
        "moduleResolution": "Node",
        "resolveJsonModule": true,
        "lib": ["ESNext", "DOM"],
        "allowJs": true,
        "checkJs": true,
        "noEmitOnError": true,
        "strict": true,
        "noImplicitAny": false,
        "strictNullChecks": false,
        "esModuleInterop": false,
        "forceConsistentCasingInFileNames": true,
        "useDefineForClassFields": true,
        "removeComments": false,
        "types": ["node", "mocha", "chai", "webpack", "tapable", "react"],
        "allowSyntheticDefaultImports": true,
        "noEmit": false,
        "declaration": true,
        "emitDeclarationOnly": true,
        "declarationDir": "./types"
    }
}

我们得到完整的类型检查,没有纯 JavaScript 无法解决的错误(我们的 TypeScript 版本是 ^4.2.4)。

但是,请记住,当您使用类型检查器时,通常您将被迫以更严格的方式编写代码(这很痛苦,但值得)。

如果您不想使用 TypeScript,因为它可能很难设置,而且如果您不想使用它的所有功能,那么它可能有点矫枉过正,您可以尝试 JSDoc(在我的看法,它应该是 JavaScript 类型注释的标准,但现实远非如此。

还考虑到您可能必须以某种方式提供类型注释(使用 TypeScript 作为类型检查引擎而不实际编写 TypeScript 的唯一方法是使用 JSDoc 或 TSDoc,这是前者的变体专为 TypeScript 设计)。

这里有一篇great article (there are many more, I recommend you to learn more about JavaScript type checking) (see this专门写JSDoc + TypeScript的。

在我们的项目中,我们是这样做的:

/** @type {Array<number>} */
const myNumbersArray = [];

myNumbersArray.push(0);   // OK
myNumbersArray.push('0'); // ERROR

或者

/** @module core/modules/string-utils/split-by-words */

import {parse} from './parse.js';

/**
 * @description Splits passed string by words.
 * @param {string} str - Input string.
 * @returns {Array<string>} Results array.
 */
function splitByWords(str) {
    return parse(str).map((item) => item.content);
}

export {splitByWords};

最后,还有许多 JSDoc ESLint 库可供您使用。