как добавить проверку что переданный компонент имеет нужные ключи в пропсах?

подскажите пожалуйста куда копать, есть HOC который прокидывает в компонент ключи WithIsIncludeHead, при этом всем, нужно прогнать пропсы этого компонента через JSX.LibraryManagedAttributes чтобы обязательные пропсы, которые указаны в defaultProps стали опциональными. Снизу подготовил реализацию этого HOC

export interface WithIsIncludeHead {
  isIncludeHead: boolean;
}

export const withIsIncludeHead = <C extends ComponentType<any>>(Component: C) => {
  type Props = JSX.LibraryManagedAttributes<C, ComponentProps<C>>;

  const displayName = getComponentDisplayName(Component);

  const WrappedComponent = forwardRef<unknown, Props>(function WrappedComponent(props, ref) {
    const isIncludeHead = useIsIncludeHead();

    return <Component {...props} ref={ref} isIncludeHead={isIncludeHead} />;
  });

  WrappedComponent.displayName = `withHead(${displayName})`;

  return WrappedComponent as ComponentType<Omit<Props, keyof WithIsIncludeHead>>;
};

Вроде все происходит так, как надо. Но есть одна проблема, нужно чтобы еще была проверка на то, что у переданного Component в пропсах были ключи WithIsIncludeHead. Чет никак не могу это реализовать, то при использованнии компонента(который прошел через hoc) вообще не проверяются пропсы, то пропсы которые были добавлены в defaultProps(после добавляения они должны стать опциональными) остаются обязательными.

Последние к чему пришел(в этой реализациии пропсы из defaultProps остались обязательными):


export const withIsIncludeHead = <OwnComponentProps extends object>(Component: ComponentType<OwnComponentProps & WithIsIncludeHead>) => {
  type PropsForRef = JSX.LibraryManagedAttributes<ComponentType<OwnComponentProps>, ComponentProps<ComponentType<OwnComponentProps>>>

  const displayName = getComponentDisplayName(Component);

  const WrappedComponent = forwardRef<unknown, PropsForRef>(function WrappedComponent(props, ref) {
    const isIncludeHead = useIsIncludeHead();

    return <Component {...props} ref={ref} isIncludeHead={isIncludeHead} />;
  });

  WrappedComponent.displayName = `withHead(${displayName})`;

  return WrappedComponent as ComponentType<Omit<PropsForRef, keyof WithIsIncludeHead>>;
};```

Ответы (0 шт):