こんなのどうでしょう?

const fallbackImage = '...';

type Props = {
  src: JSX.IntrinsicElements['img']['src'];
  alt?: JSX.IntrinsicElements['img']['alt'];
  srcOnError?: JSX.IntrinsicElements['img']['src'];
  className?: JSX.IntrinsicElements['img']['className'];
};

function Component(props: Props) {
  const { src, alt, srcOnError, className } = props;
  const srcFileName = src?.split('/').pop()?.split('.').shift();
  return (
    <img
      className={className}
      src={src}
      alt={alt || srcFileName}
      onError={(e) => {
        e.currentTarget.onerror = null;
        e.currentTarget.src = srcOnError ?? fallbackImage;
      }}
    />
  );
}

export const Image = Component;

嬉しい点1:エラー時のハンドリング

ネットワークエラー等で画像が取得できなかったときは、自動でフォールバック用の画像を設定してくれます。

onError={(e) => {
  e.currentTarget.onerror = null;
  e.currentTarget.src = srcOnError ?? fallbackImage;
}}

嬉しい点2:alt 属性を自動で設定

alt を明記しなかった場合、画像のファイル名を自動で alt に設定してくれます。

// src が '/public/images/my-dog.jpg' だった場合 srcFileName は 'my-dog'

const srcFileName = src?.split('/').pop()?.split('.').shift();

alt={alt || srcFileName}