javascript - Egenskapen 'Group' eksisterer ikke på typen 'ForwardRefExoticComponent>'


Jeg prøver å binde et React Hook Form til radio og radiogruppe. Imidlertid får jeg følgende problem

Property 'Group' does not exist on type 'ForwardRefExoticComponent<InputProps & RefAttributes<HTMLInputElement>>'.  TS2339

Dette er koden

import { Radio as $Radio } from 'antd';
import { RadioProps, RadioChangeEvent } from 'antd/lib/radio';

import { Controller } from 'react-hook-form';
import { InputProps } from './types';

const Radio = React.forwardRef<HTMLInputElement, InputProps>((props: InputProps, ref) => {
  const { id, name, label, control } = props;
  return (
    <>
      <Controller
        name={name}
        control={control}
        render={(controlProps: RadioProps) => {
          const { onChange } = controlProps;
          return (
            <$Radio
              {...controlProps}
              id={id}
              checked={controlProps.value}
              value={controlProps.value}
              className="radio"
            >
              {label}
            </$Radio>
          );
        }}
      />
    </>
  );
});

export default Radio;

Radio.Group = (props: InputProps) => {
  const { id, name, label, control } = props;
  return (
    <>
      <Controller
        name={name}
        control={control}
        render={(controlProps: RadioProps) => {
          const { onChange } = controlProps;
          return (
            <$Radio.Group
              {...controlProps}
              id={id}
              checked={controlProps.value}
              value={controlProps.value}
              className="radio"
            >
              {label}
            </$Radio.Group>
          );
        }}
      />
    </>
  );
}

Jeg klarte ikke å finne ut hvorfor jeg får et slikt problem. Hvordan kan jeg binde react-hook-form til Radio Group?

Svar #1

Typen for din Radio-variabel er en React-komponent, spesifikt ForwardRefExoticComponent<InputProps & RefAttributes<HTMLInputElement>>. Det du gjør er å legge til en annen komponent som en egenskap på denne komponenten. TypeScript klager på det fordi en React-komponent ikke har noen definisjon for en egenskap kalt Group.

Det er mulig å legge til vilkårlige egenskaper til komponenten vår, men vi må fortelle TypeScript om dem.

Her er typene fra antd-pakken:

interface CompoundedComponent extends React.ForwardRefExoticComponent<RadioProps & React.RefAttributes<HTMLElement>> {
    Group: typeof Group;
    Button: typeof Button;
}
declare const Radio: CompoundedComponent;
export { Button, Group };
export default Radio;

Du kan se at Radio er deklarert både som en React-komponent og som et objekt med egenskapene Group og Button.

I stedet for å skrive Radio.Group=... ville jeg laget Group som sin egen komponent: const Group=.... Deretter kombinerer du de to sammen på slutten før du eksporterer.

type CompoundedType = typeof Radio & {
  Group: typeof Group;
}

const Compounded = Radio as CompoundedType;
Compounded.Group = Group;

export default Compounded;

Den kritiske delen her er Radio as CompoundedType som forteller TypeScript å behandle typen for Compounded som CompoundedType selv om det ikke finnes noen Group-egenskap ennå. Vi trenger as for å overstyre TypeScripts instinkter.

Relaterte artikler