typescript 如何解决React中的“逗号运算符左侧未使用且没有副作用.ts(2695)”错误?

8gsdolmq  于 2023-02-17  发布在  TypeScript
关注(0)|答案(2)|浏览(876)
import React from "react";
import { useRecoilState } from "recoil";
import { Industry, industryState } from "../atoms/industriesAtoms";

const useIndustryData = () => {
  const [industryStateValue, setIndustryStateValue] =
  useRecoilState(industryState);

  const onJoinOrLeaveIndustry = (industryData: Industry, isJoined: boolean) => {
    // is the user signed in
    // if not => open auth modal

    if (isJoined) {
      leaveIndustry(industryData.id);
      return;
    }
    joinIndustry(industryData);
    // onJoinOrLeaveIndustry;
  };

  const joinIndustry = (industryData: Industry) => {};

  const leaveIndustry = (industryId: string) => {};

  return (

  // data and functions,
  *industryStateValue,* onJoinOrLeaveIndustry
 );

};
export default useIndustryData;

我正在一个react项目中处理上面的代码,在屏幕截图的第27行中,我收到了一个错误,即逗号操作符左侧未使用,没有副作用。ts(2695)。
我想了解为什么会出现此错误,以及如何解决此错误。
我发现了一个类似的问题here,但解决方案对我自己的情况没有帮助。

cedebl8k

cedebl8k1#

此代码:

return (
    // data and functions,
    industryStateValue, onJoinOrLeaveIndustry
);

等价于:

return (
    // data and functions,
    onJoinOrLeaveIndustry
);

...因为industryStateValue是一个简单变量,所以计算它没有副作用。comma operator计算它的左操作数,抛出该值,再计算右操作数,然后将该值作为结果。
如果你想同时返回这两个值,你必须把它们 Package 起来,当只有两个或三个这样的值时,通常把它们 Package 在一个数组中:

return [ // <===
    // data and functions,
    industryStateValue, onJoinOrLeaveIndustry
];       // <===

然后,使用钩子的代码可以解构为离散变量,就像处理useStateuseRecoilState一样:

const [state, handler] = useIndustryData();

如果愿意,可以使用{}代替[],从而使用对象代替数组:

return { // <===
    // data and functions,
    industryStateValue, onJoinOrLeaveIndustry
};       // <===

那么使用它的代码将使用对象解构({}代替[]):

const { industryStateValue, onJoinOrLeaveIndustry } = useIndustryData();

对于少量值(比如说,三个或更少),通常的做法是使用useStateuseRecoilState这样的数组,因为调用者更容易控制它们要反构到的变量的名称。但是对于四个或更多的值,对象就更清晰了,因为当你进入那么多的值时,位置反构可能很难理解。下面是调用者在反构对象时如何使用不同的名称(如数组示例中的statehandler):

const { industryStateValue: state, onJoinOrLeaveIndustry: handler } = useIndustryData();
v64noz0r

v64noz0r2#

我不小心将新文件命名为.ts,而不是.tsx,因此出现此错误。
该文件中包含JSX,并导致linter(eslint)无法识别JS对象中的JSX是否有效。
一旦我将文件扩展名更改为.tsx,linter就平静下来,并将对象结构识别为有效。:)
下面是一个简单的示例,说明在我的案例中触发错误的原因:

const getMenuItems = () => {
  return [
    {
      type: 'link',
      title: 'List',
      link: '/agents/list',
      icon: {
        asset: <NavIcon icon={'rocket'} />,
      },
    },
  ];

由于属性asset包含JSX,所以当文件扩展名为.ts时,linter会发脾气。使用.tsx时,一切都很好。
当然,这是预期的行为,但我花了一分钟才意识到发生了什么--特别是因为我得到的错误并没有真正帮助查明问题所在。

相关问题