Recharts 自定义工具提示的 Typescript 接口

Typescript Interface for Recharts Custom Tooltip

我还不精通 Typescript,我正在尝试 create a custom Tooltip content 在我的 React 应用程序中使用 Typescript 制作我的 Recharts 图表。 @types/recharts 已经安装为 devDependencies.

之一

但是,当我如下所示定义 CustomTooltip 函数时,Typescript 会抛出错误

Binding element 'active' implicitly has an 'any' type. TS7031

我们如何解决这个问题?

const CustomTooltip = ({ active, payload, label }) => {
    if (active) {
        return (
        <div className="custom-tooltip">
            <p className="label">{`${label} : ${payload[0].value}`}</p>
            <p className="desc">Anything you want can be displayed here.</p>
        </div>
        );
    }

    return null;
}

return (
    <ComposedChart data={data}>
        ...
        <Tooltip content={<CustomTooltip />} />
    </ComposedChart>
)

尝试定义接口,但出现另一个错误

Type '{}' is missing the following properties from type 'ICustomToolip': active, payload, label TS2739

interface ICustomToolip {
    active: any;
    payload: any;
    label: any;
}

const CustomTooltip = ({ active, payload, label }: ICustomToolip) => {
    if (active) {
        return (
        <div className="custom-tooltip">
            <p className="label">{`${label} : ${payload[0].value}`}</p>
            <p className="desc">Anything you want can be displayed here.</p>
        </div>
        );
    }

    return null;
}

它通常对我有用,但其他方式可能是:

const CustomTooltip = ({ active, payload, label }: any) => {

尝试执行以下操作(使用重新图表的类型)。

但请记住,您必须添加 @types/recharts npm 包 ;)

import { TooltipProps } from 'recharts';
import {
  ValueType,
  NameType,
} from 'recharts/src/component/DefaultTooltipContent';

const CustomTooltip = ({
  active,
  payload,
  label,
}: TooltipProps<ValueType, NameType>) => {
  if (active) {
    return (
      <div className="custom-tooltip">
        <p className="label">{`${label} : ${payload?.[0].value}`}</p>
        <p className="desc">Anything you want can be displayed here.</p>
      </div>
    );
  }

  return null;
};

return (
  <ComposedChart data={data}>
    ...
    <Tooltip content={<CustomTooltip />} />
  </ComposedChart>
);

通常

TooltipProps<number, string>

但取决于你的图形数据,所以一般

TooltipProps<ValueType, NameType>

下面是一些可能对人们有所帮助的代码。我正在使用打字稿顺便说一句。我在没有显式接口的情况下做到了这一点,只是像这样的任何类型。

                `{ 
                    'time': item.DateTime.getTime(),
                    'data': 1,
                    'change_type': "some_string",
                }`

在你的 TSX 中,确保像这样传入 undefined 。网站上的示例没有明确说明就很好,但我的编辑抱怨有一些错误。 <Tooltip content={<CustomTooltip active={undefined} payload={undefined} label={undefined}/>} />

对于 CustomToolTip,这对我来说很难理解。有效负载的索引必须为 0。然后调用点运算符,因为那里有一个有效负载 class 可以访问您的自定义属性,例如时间、数据和 change_type

    const CustomTooltip = ({ active, payload, label }) => {
    if (active && payload && payload.length) {
      return (
        <div className="custom-tooltip">
          <p className="label">{`${label} : ${payload[0].payload.time}`}</p>
          <p className="label">{`${label} : ${payload[0].payload.data}`}</p>
          <p className="label">{`${payload[0].payload.change_type}`}</p>
          <p className="desc">Anything you want can be displayed here.</p>
        </div>
      );
    }
  
    return null;
  };

然后它应该会正确弹出,悬停时不会出现任何问题。

const CustomTooltip = ({
  active,
  payload,
  label,
}: {
  active: boolean;
  label: string;
  payload: {
    payload: {
      value: number
    }
  }[];
}) => {
  if (active) {
    return ( <
      div className = "custom-tooltip" >
      <
      p className = "label" > {
        `${label} : ${payload[0].value}`
      } < /p> <
      p className = "desc" > Anything you want can be displayed here. < /p> <
      /div>
    );
  }

  return null;
};

return ( <
  ComposedChart data = {
    data
  } >
  ...
  <
  Tooltip content = { < CustomTooltip active = {
      false
    }
    payload = {
      []
    }
    label = "" / >
  }
  /> <
  /ComposedChart>
);

接受的答案是错误的,并且在正确配置了 typescript 并且禁止使用 any 的项目中会失败。

使用:

const CustomTooltip = ({ active, payload, label }: TooltipProps<number, string>): JSX.Element => {

将数字和字符串更改为您的数据类型。您也可以将它与 ValueType 和 NameType 一起使用,但使用您的类型声明它更有意义。

const CustomTooltip = ({ active, payload, label }: TooltipProps<ValueType, NameType>): JSX.Element => {