You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于@heroicons封装Icon组件:类型定义与图标匹配问题

基于Heroicons封装通用Icon组件的解决方案

1. 生成图标名称的联合类型

利用TypeScript的keyof typeof操作符,直接提取IconsSolid或IconsOutline模块导出的所有图标名称,自动生成联合类型,无需手动枚举:

type IconName = keyof typeof IconsSolid;

由于Heroicons的solid和outline版本图标名称完全对应,这个类型可以同时约束两个变体的图标名称参数。

2. 根据名称动态渲染图标

将IconsSolid和IconsOutline视为包含图标组件的对象,通过图标名称作为索引获取对应组件,再进行渲染:

完整代码

import React from 'react';
export * as IconsSolid from '@heroicons/react/24/solid';
export * as IconsOutline from '@heroicons/react/24/outline';

// 生成图标名称联合类型
type IconName = keyof typeof IconsSolid;

interface IconProps extends React.SVGAttributes<SVGElement> {
  name: IconName;
  variant: 'solid' | 'outline';
}

export const Icon = ({ name, variant, className, ...props }: IconProps) => {
  // 根据变体和名称获取对应图标组件
  const IconComponent = variant === 'solid' 
    ? IconsSolid[name] 
    : IconsOutline[name];

  // 渲染图标组件,传递剩余属性
  return <IconComponent className={className} {...props} />;
};

使用示例

<Icon name="XMarkIcon" variant="solid" className="w-6 h-6 text-red-500" />
<Icon name="CheckIcon" variant="outline" className="w-5 h-5 text-green-600" />

内容的提问来源于stack exchange,提问作者podeig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:38:29