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

準備
書き直すベースはこちらの Timeline コンポーネントです。
JavaScript
ベースの Timeline.js です。
import React, { forwardRef } from 'react';
import {
  Timeline as FlowbiteTimeline,
} from 'flowbite-react';
const Timeline = (
  {
    children,
    className,
    horizontal,
    ...otherProps
  },
) => {
  return (
    <FlowbiteTimeline
      className={className}
      horizontal={horizontal}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline>
  );
};
const TimelineItem = forwardRef((
  {
    children,
    className,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteTimeline.Item
      className={className}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Item>
  );
});
const TimelinePoint = forwardRef((
  {
    children,
    className,
    icon,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteTimeline.Point
      className={className}
      icon={icon}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Point>
  );
});
const TimelineContent = forwardRef((
  {
    children,
    className,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteTimeline.Content
      className={className}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Content>
  );
});
const TimelineTime = forwardRef((
  {
    children,
    className,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteTimeline.Time
      className={className}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Time>
  );
});
const TimelineTitle = forwardRef((
  {
    as,
    children,
    className,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteTimeline.Title
      as={as}
      className={className}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Title>
  );
});
const TimelineBody = forwardRef((
  {
    children,
    className,
    ...otherProps
  },
  ref,
) => {
  return (
    <FlowbiteTimeline.Body
      className={className}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Body>
  );
});
export default Object.assign(Timeline, {
  Item: TimelineItem,
  Point: TimelinePoint,
  Content: TimelineContent,
  Time: TimelineTime,
  Title: TimelineTitle,
  Body: TimelineBody,
});
TypeScript
Timeline.tsx として編集します。
import React, { ComponentProps, forwardRef, LegacyRef } from 'react';
import {
  Timeline as FlowbiteTimeline,
  TimelineProps as FlowbiteTimelineProps,
} from 'flowbite-react';
type TimelineProps = {} & FlowbiteTimelineProps;
const Timeline = (
  {
    children,
    className,
    horizontal,
    ...otherProps
  }: TimelineProps,
) => {
  return (
    <FlowbiteTimeline
      className={className}
      horizontal={horizontal}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline>
  );
};
type TimelineItemProps = {} & ComponentProps<typeof FlowbiteTimeline.Item>;
const TimelineItem = forwardRef((
  {
    children,
    className,
    ...otherProps
  }: TimelineItemProps,
  ref: LegacyRef<HTMLLIElement>,
) => {
  return (
    <FlowbiteTimeline.Item
      className={className}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Item>
  );
});
type TimelinePointProps = {} & ComponentProps<typeof FlowbiteTimeline.Point>;
const TimelinePoint = forwardRef((
  {
    children,
    className,
    icon,
    ...otherProps
  }: TimelinePointProps,
  ref: LegacyRef<HTMLDivElement>,
) => {
  return (
    <FlowbiteTimeline.Point
      className={className}
      icon={icon}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Point>
  );
});
type TimelineContentProps = {} & ComponentProps<typeof FlowbiteTimeline.Content>;
const TimelineContent = forwardRef((
  {
    children,
    className,
    ...otherProps
  }: TimelineContentProps,
  ref: LegacyRef<HTMLDivElement>,
) => {
  return (
    <FlowbiteTimeline.Content
      className={className}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Content>
  );
});
type TimelineTimeProps = {} & ComponentProps<typeof FlowbiteTimeline.Time>;
const TimelineTime = forwardRef((
  {
    children,
    className,
    ...otherProps
  }: TimelineTimeProps,
  ref: LegacyRef<HTMLTimeElement>,
) => {
  return (
    <FlowbiteTimeline.Time
      className={className}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Time>
  );
});
type TimelineTitleProps = {} & ComponentProps<typeof FlowbiteTimeline.Title>;
const TimelineTitle = forwardRef((
  {
    as,
    children,
    className,
    ...otherProps
  }: TimelineTitleProps,
  ref: LegacyRef<HTMLHeadingElement>,
) => {
  return (
    <FlowbiteTimeline.Title
      as={as}
      className={className}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Title>
  );
});
type TimelineBodyProps = {} & ComponentProps<typeof FlowbiteTimeline.Body>;
const TimelineBody = forwardRef((
  {
    children,
    className,
    ...otherProps
  }: TimelineBodyProps,
  ref: LegacyRef<HTMLParagraphElement>,
) => {
  return (
    <FlowbiteTimeline.Body
      className={className}
      ref={ref}
      {...otherProps}
    >
      {children}
    </FlowbiteTimeline.Body>
  );
});
export default Object.assign(Timeline, {
  Item: TimelineItem,
  Point: TimelinePoint,
  Content: TimelineContent,
  Time: TimelineTime,
  Title: TimelineTitle,
  Body: TimelineBody,
});
結果
変化はないので、前と同じ。

はい、できました。













