我整个上午都在为这个问题苦苦挣扎,在任何地方都找不到解决方案.我是typescript新手,我正在try 使用Eslint和Prettier正确设置它,以确保代码的格式正确.

所以,我在创建功能组件时面临的问题.根据备忘单,我正在try 导出一个简单的组件,例如:

import React from "react";

type DivProps = {
  text: string;
};

const Div = ({ text }: DivProps): JSX.Element => (<div>{text}</div>)

export default Div;

然而,eslint抱怨说,"函数组件不是函数表达式".

运行fix时,它会将我的函数转换为未命名函数:

const Div = function ({ text }: DivProps): JSX.Element {
  return <div>{text}</div>;
};

然后它会抱怨说"意外的未命名函数".

即使我试图将函数重构为:

function Div({ text }: DivProps): JSX.Element {
  return <div>{text}</div>;
};

我仍然会遇到同样的错误,说"函数组件不是函数表达式".

我的eslintrc.js文件是:

module.exports = {
  env: {
    browser: true,
    es2021: true,
  },
  extends: ["airbnb", "plugin:@typescript-eslint/recommended", "prettier"],
  parser: "@typescript-eslint/parser",
  parserOptions: {
    ecmaFeatures: {
      jsx: true,
    },
    ecmaVersion: 12,
    sourceType: "module",
  },
  plugins: ["@typescript-eslint", "react-hooks", "prettier"],
  rules: {
    "react-hooks/rules-of-hooks": "error",
    "prettier/prettier": "error",
    "no-use-before-define": "off",
    "@typescript-eslint/no-use-before-define": ["error"],
    "react/jsx-filename-extension": [
      1,
      {
        extensions: [".tsx"],
      },
    ],
    "import/prefer-default-export": "off",
    "import/extensions": [
      "error",
      "ignorePackages",
      {
        ts: "never",
        tsx: "never",
      },
    ],
  },
  settings: {
    "import/resolver": {
      typescript: {},
    },
  },
};

感谢您在这方面的帮助!

PS:如果您在eslintrc文件中看到任何其他需要修改/改进的内容,请告诉我.正如我所提到的,我对打字脚本还不熟悉,所以我仍在努力寻找最佳的线头 Select .

干杯

亚历杭德罗

推荐答案

FINAL Update:这已更正为eslint-config-airbnb版本19.0.4

最好的办法是将该软件包的副本更新到19.0.4或更高版本.


Past Update: this is actually this was 100 versions 18.2.1 to 19.0.2

正确的设置应该是function-declaration,因此正确的解决方案是覆盖.eslintrc.js中的规则

"react/function-component-definition": [
  2,
  {
    namedComponents: "function-declaration",
  },
],

^默认情况下,airbnb设置中当前有为an open PR a now merged PR to make that patch,因此此更改将使您的项目与预期设置一致.

Note: You may want to consider navigating to the 100 and upvoting it so the maintainers know you're dealing with it.

现在问题已经解决,您应该将您的版本更新到19.0.4或更高版本.

Another Option: Downgrading airbnb rules

another answer所述:如果您愿意,还可以将airbnb规则的版本降级到引入"坏"规则之前(v18.2.1是没有此规则的最新版本).这是通过更新您的包来完成的.json:

"devDependencies": {
  ...
  "eslint-config-airbnb": "^18.2.1"
}

请注意,这意味着您的项目将不会使用最新的airbnb styleguide,因此您可能会决定最好直接覆盖该规则.


My previous answer, which will create "valid" code according to the linter:

我也面临着这个问题;我能够想出如何编写符合airbnb规则的代码,但是...我觉得结果很尴尬,我也不确定为什么会是首选结果.

在默认规则下,您需要(A)使用函数表达式定义组件,但(B)不能使用匿名函数(这是为了防止堆栈跟踪中出现"匿名函数"),因此还必须命名函数:

const MyComponent = function MyComponent() { ... }

以你的例子来说:

const Div = function Div({ text }: DivProps): JSX.Element {
  return <div>{text}</div>;
};

这让林特满意,但是...哎呀,我说得对吗?

Typescript相关问答推荐

Angular 17 -如何使用新的@if语法在对象中使用Deliverc值

无法将select选项的值设置为ngFor循环中的第一个元素

打字脚本中泛型和直接类型重新映射的不同行为

编剧错误:正在等待Expect(Locator).toBeVisible()

在TypeScrip的数组中判断模式类型

如何解决类型T不能用于索引类型{ A:typeof A; B:typeof B;. }'

Cypress页面对象模型模式.扩展Elements属性

如何使用模板继承从子组件填充基础组件的画布

如何合并两个泛型对象并获得完整的类型安全结果?

如何将父属性类型判断传播到子属性

不带其他属性的精确函数返回类型

基元类型按引用传递的解决方法

在类型脚本中将泛型字符串数组转换为字符串字母并集

将带有样式的Reaction组件导入到Pages文件夹时不起作用

TypeScrip-如何自动推断UNION变量的类型

如何在打字角react 式中补齐表格组

必需的输入()参数仍然发出&没有初始值设定项&q;错误

Typescript泛型调用对象';s方法

如何将对象的字符串文字属性用作同一对象中的键类型

如何在Vue动态类的上下文中解释错误TS2345?