[React+Tailwind] Footer を TypeScript に書き直してみた | 心を無にして始める React

準備
書き直すベースはこちらの Footer コンポーネントです。
JavaScript
ベースの Footer.js です。
import { forwardRef } from 'react';
import { Footer as FlowbiteFooter } from 'flowbite-react';
const Footer = forwardRef((
  {
    bgDark = false,
    children,
    container = false,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteFooter
      bgDark={bgDark}
      container={container}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter>
  );
});
const FooterBrand = forwardRef((
  {
    alt,
    children,
    href,
    name,
    src,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteFooter.Brand
      alt={alt}
      href={href}
      name={name}
      ref={ref}
      src={src}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.Brand>
  );
});
const FooterCopyright = forwardRef((
  {
    by,
    children,
    href,
    year,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteFooter.Copyright
      by={by}
      href={href}
      ref={ref}
      year={year}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.Copyright>
  );
});
const FooterDivider = (
  {
    ...otherProps
  },
) => {
  return (
    <FlowbiteFooter.Divider
      {...otherProps}
    />
  );
};
const FooterIcon = forwardRef((
  {
    ariaLabel,
    children,
    href,
    icon,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteFooter.Icon
      ariaLabel={ariaLabel}
      href={href}
      icon={icon}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.Icon>
  );
});
const FooterLink = forwardRef((
  {
    children,
    href,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteFooter.Link
      href={href}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.Link>
  );
});
const FooterLinkGroup = forwardRef((
  {
    children,
    col = false,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteFooter.LinkGroup
      col={col}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.LinkGroup>
  );
});
const FooterTitle = forwardRef((
  {
    children,
    title,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteFooter.Title
      ref={ref}
      title={title}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.Title>
  );
});
export default Object.assign(Footer, {
  Brand: FooterBrand,
  Copyright: FooterCopyright,
  Divider: FooterDivider,
  Icon: FooterIcon,
  Link: FooterLink,
  LinkGroup: FooterLinkGroup,
  Title: FooterTitle,
});TypeScript
Footer.tsx として編集します。
import { ComponentProps, forwardRef, LegacyRef } from 'react';
import {
  Footer as FlowbiteFooter,
  FooterProps as FlowbiteFooterProps,
} from 'flowbite-react';
type FooterProps = {} & FlowbiteFooterProps
const Footer = forwardRef((
  {
    bgDark = false,
    children,
    container = false,
    ...otherProps
  }: FooterProps,
  ref: LegacyRef<HTMLElement>,
) => {
  return (
    <FlowbiteFooter
      bgDark={bgDark}
      container={container}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter>
  );
});
type FooterBrandProps = {} & ComponentProps<typeof FlowbiteFooter.Brand>
const FooterBrand = forwardRef((
  {
    alt,
    children,
    href,
    name,
    src,
    ...otherProps
  }: FooterBrandProps,
  ref: LegacyRef<HTMLDivElement>,
) => {
  return (
    <FlowbiteFooter.Brand
      alt={alt}
      href={href}
      name={name}
      ref={ref}
      src={src}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.Brand>
  );
});
type FooterCopyrightProps = {} & ComponentProps<typeof FlowbiteFooter.Copyright>
const FooterCopyright = forwardRef((
  {
    by,
    children,
    href,
    year,
    ...otherProps
  }: FooterCopyrightProps,
  ref: LegacyRef<HTMLSpanElement>,
) => {
  return (
    <FlowbiteFooter.Copyright
      by={by}
      href={href}
      ref={ref}
      year={year}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.Copyright>
  );
});
type FooterDividerProps = {} & ComponentProps<typeof FlowbiteFooter.Divider>
const FooterDivider = (
  {
    ...otherProps
  }: FooterDividerProps,
) => {
  return (
    <FlowbiteFooter.Divider
      {...otherProps}
    />
  );
};
type FooterIconProps = {} & ComponentProps<typeof FlowbiteFooter.Icon>
const FooterIcon = forwardRef((
  {
    ariaLabel,
    children,
    href,
    icon,
    ...otherProps
  }: FooterIconProps,
  ref: LegacyRef<HTMLAnchorElement>,
) => {
  return (
    <FlowbiteFooter.Icon
      ariaLabel={ariaLabel}
      href={href}
      icon={icon}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.Icon>
  );
});
type FooterLinkProps = {} & ComponentProps<typeof FlowbiteFooter.Link>
const FooterLink = forwardRef((
  {
    children,
    href,
    ...otherProps
  }: FooterLinkProps,
  ref: LegacyRef<HTMLAnchorElement>,
) => {
  return (
    <FlowbiteFooter.Link
      href={href}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.Link>
  );
});
type FooterLinkGroupProps = {} & ComponentProps<typeof FlowbiteFooter.LinkGroup>
const FooterLinkGroup = forwardRef((
  {
    children,
    col = false,
    ...otherProps
  }: FooterLinkGroupProps,
  ref: LegacyRef<HTMLUListElement>,
) => {
  return (
    <FlowbiteFooter.LinkGroup
      col={col}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.LinkGroup>
  );
});
type FooterTitleProps = {} & ComponentProps<typeof FlowbiteFooter.Title>
const FooterTitle = forwardRef((
  {
    children,
    title,
    ...otherProps
  }: FooterTitleProps,
  ref: LegacyRef<HTMLHeadingElement>,
) => {
  return (
    <FlowbiteFooter.Title
      ref={ref}
      title={title}
      {...otherProps}
    >
      {children}
    </FlowbiteFooter.Title>
  );
});
export default Object.assign(Footer, {
  Brand: FooterBrand,
  Copyright: FooterCopyright,
  Divider: FooterDivider,
  Icon: FooterIcon,
  Link: FooterLink,
  LinkGroup: FooterLinkGroup,
  Title: FooterTitle,
});結果
変化はないので、前と同じ。

はい、できました。

![[React+Tailwind] Flowbite で Footer を表示してみる | 心を無にして始める React](https://neko-note.org/wp-content/uploads/flowbite-thumbnail-100x100.png)
 https://neko-note.org/react-tailwind-flowbite-footer/1191
 https://neko-note.org/react-tailwind-flowbite-footer/1191












