reactjs - React 组件的通用 props

标签 reactjs typescript

我有一个Linechart组件

<LineChart />

此组件应采用两个属性 xFieldyField 均为字符串。为此,我创建了 prop 类型

type Props = {
    xField: string;
    yField: string;
}
// e.g <LineChart xField="Date" yField="EUR"/>

该组件还应采用数据点数组(具有两个键的对象),例如:

<LineChart xField="Date" yField="EUR" data={[
  {Date:"22.2.2022", EUR:231}
  {Date:"23.2.2022", EUR:142}
  {Date:"24.2.2022", EUR:152}
]} />

现在,data 数组中对象的键应限制为 xFieldyField 的值

<LineChart xField="Date" yField="EUR" data={[
  {Date:"22.2.2022", EURO:231} // Compile error since "EURO" is not a valid key
  {Date:"23.2.2022", EURO:142}
  {Date:"24.2.2022", EURO:152}
]} />

<LineChart xField="Date" yField="EUR" data={[
  {Date:"22.2.2022", EUR:231} // No compile error, EUR is a valid key since yField = "EUR"
  {Date:"23.2.2022", EUR:142}
  {Date:"24.2.2022", EUR:152}
]} />

如何修改 Linechart 组件的 Props 以匹配此行为?我想要实现的目标有可能吗?

我的折线图组件如下所示

export default function LineChart({ data, xField, yField }: Props) {
  const config: LineConfig = {
    data,
    xField,
    yField,
    slider: {
      start: 0.1,
      end: 0.5,
    },
  };

  return <Line {...config} style={{ gridRow: "2/4", gridColumn: "2/8" }} />;
}

最佳答案

您可以使用泛型来处理这个问题。为扩展字符串的 xy 设置类型。然后,使用该类型作为数据数组的键。

interface Props<X extends string, Y extends string> {
  x: X;
  y: Y;
  data: Array<{ [k in X | Y]: k extends X ? string : number }>;
}

function MyComponent<X extends string, Y extends string>(
  props: Props<X, Y>
): JSX.Element {
  return <div />;
}

function MyComponent2() {
  return (
    <MyComponent
      x="Date"
      y="Eur"
      data={[
        { Date: '20-10-2022', Eur: 1 },
        { Date: '20-10-2022', Eur: 1 },
        { Date: '20-10-2022', Eur: 1 },
      ]}
    />
  );
}

关于reactjs - React 组件的通用 props,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74246347/

相关文章:

javascript - 如何在规范化的 redux 存储中组织部分实体?

javascript - "Maximum update depth exceeded"表单验证

javascript - Material ui的加载栏组件的颜色变化

TypeScript 推断数组 [index]

reactjs - 枚举值中的字符串连接

typescript :在将可选类型与必需类型合并时创建并集而不是交集

javascript - 如何使用 javascript 轻松修改 yaml 文件?

javascript - React - 来自字符串的动态属性

javascript - Angular 8 NgRx - 错误 : Detected unserializable action

typescript - 推断类泛型属性方法返回类型