deadrime
@deadrime
Fullstack web developer

Возможно ли получить тип пропсов у child?

Делаю библиотеку для работы с формой, у FormItem в моей либе есть поле getValueFromEvent. Это сделано например для кейса:

<FormItem
  name="myField"
  getValueFromEvent={e => Number(e.target.value})
  normalize={value => String(value)}
>
  <input />
</FormItem>


Могу ли я достать тип onChange из ?

Пробовал вот так -

type ReturnElementProps<T> = T extends React.ReactElement<infer P> ? P : never

type FormItemProps<C extends React.ReactElement, P extends ReturnElementProps<C>> = { getValueFromEvent: (...args: Parameters<P['onChange']>) => void, children: C }

const FormItem = <C extends React.ReactElement, P extends ReturnElementProps<C>>(props: FormItemProps<C, P>) => {
  return <div>{props.children}</div>
}

const Test = <FormItem getValueFromEvent={(event) => event}>
  <input />
</FormItem>


но event - unknown.

можно как-то вытащить пропсы из children, который ReactElement? Или только заставлять использовать function в качестве children?
  • Вопрос задан
  • 75 просмотров
Пригласить эксперта
Ответы на вопрос 1
neuotq
@neuotq
Прокрастинация
Немного не ясно что вы хотите, вот это получать?
type ReturnElementProps<T> = T extends React.ReactElement<infer P> ? P : never;

type FormItemProps<
  C extends React.ReactElement,
  P extends ReturnElementProps<C>
> = {
  getValueFromEvent: (...args: Parameters<P["onChange"]>) => void;
  children: C;
};

const FormItem = <
  C extends React.ReactElement,
  P extends ReturnElementProps<C>
>(
  props: FormItemProps<C, P>
) => {
  // из пропсов вашего компонента берём дочерний элемент
  const { children } = props;
  // из пропсов дочернего берем onChange
  const { onChange } = children.props;
  //тест
  console.log("Child onChange cb", onChange.toString());
  return children;
};

export default function App() {
  return (
    <div className="App">      
      <FormItem getValueFromEvent={(event) => event}>
        <input onChange={(e) => console.log("Children e", e.target.value)} />
      </FormItem>
    </div>
  );
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы