kentcdodds / mdx-bundler

🦤 Give me MDX/TSX strings and I'll give you back a component you can render. Supports imports!
MIT License
1.78k stars 75 forks source link

Props type for overriden components #213

Open kwiat1990 opened 1 year ago

kwiat1990 commented 1 year ago

Hi, I'm wondering if there's some typing I could use when overriding HTML elements like this:

const components = {
  img: ({
    src,
    ...attrs
    }: React.DetailedHTMLProps<
      React.ImgHTMLAttributes<HTMLImageElement>,
      HTMLImageElement
    >) => {
      return (
        <Image
          dprVariants={[2, 3]}
          placeholder="blur"
          responsive={[
      {
            size: {
              width: 400,
            }
            maxWidth: 500,
      }
        ]}
        src={src}
        {...attrs}
    />
  );
}}

export function MDXComponent({ component }: Props) {
  const Component = React.useMemo(
    () => getMDXComponent(component),
    [component],
  );
  return <Component components={components} />;
}

With the types it doesn't work because Image component have placeholder prop, which make Typescript complains about: Type 'string' is not assignable to type '"blur" | "empty" | undefined'.ts(2322) types.d.ts(16, 5): The expected type comes from property 'placeholder' which is declared here on type 'IntrinsicAttributes & ImageProps'. Similar problem comes up when using<div> inside an <li> element and so one. Is there some way to make Typescript happy?