从 SVG 构建类型化的 React 组件

将原始 SVG 代码转换为可复用的 TSX 图标,并保持颜色、尺寸和可访问性行为一致。

将 SVG 直接粘贴到代码中,往往会产生不一致的 props 和硬编码的值。本指南提供一套干净的 React + TypeScript 图标工作流。

1) 规范化 SVG 输入

  • 在转换前清理不必要的分组、元数据和内联样式。
  • 保留 viewBox,让组件的缩放行为保持可预测。
  • 重命名 ID 和蒙版,避免多个图标在同一页面渲染时产生冲突。

2) 生成类型安全的组件

  • 使用扩展 SVG props 的 TypeScript props,获得完整的 IntelliSense 支持。
  • 设置默认宽高,并允许父级使用处覆盖。
  • 当图标需要继承文本颜色时,用 currentColor 替换固定 fill。

3) 集成到设计系统

  • 将图标存放在可预测的文件夹中,并通过单一 barrel 文件导出。
  • 在 CI 中应用 lint 规则或测试,阻止无效的 SVG 属性。
  • 为语义化尺寸 token 和 aria 标签编写使用示例文档。

SVG 转 React TypeScript 常见问题

图标组件应该用固定颜色还是 currentColor?
对于设计系统图标,通常 currentColor 更好,因为颜色可以由父级文本或主题 token 控制。
如何为图标 props 定义类型?
以 React.SVGProps<SVGSVGElement> 为基础,仅在需要时添加可选的自定义 props。
可以让无障碍标签保持灵活吗?
可以。暴露 title/aria-label props,并为装饰性图标默认使用 aria-hidden。
React 转换前需要先优化吗?
需要。先优化可以降低噪音,避免把不必要的属性带进 TSX 文件。