如何在ChakraUI中为通过as props覆写的自定义组件使用Variant?
解决自定义Label组件无法继承目标组件props的问题
你的问题出在组件的类型定义上:当前Label组件固定接收BoxProps类型的参数,不管你通过as指定渲染成什么组件,TypeScript只会校验Box本身的属性,所以Button的variant这类属性不在BoxProps里,自然会报错。
要让Label支持继承as指定组件的所有props,需要用泛型+多态组件类型来改造:
修改后的组件代码
import React, { ElementType, ComponentPropsWithRef } from 'react'; import { Box, BoxProps } from '@mui/material'; // 若使用自定义Box,替换为你的Box类型即可 // 定义多态props类型:合并Box属性与目标组件属性 type LabelProps<T extends ElementType> = Omit<BoxProps, 'as'> & { as?: T } & Omit<ComponentPropsWithRef<T>, keyof BoxProps>; export function Label<T extends ElementType = typeof Box>({ children, ...props }: LabelProps<T>) { return <Box {...props}>{children}</Box>; }
代码说明
- 泛型
T用来指定as对应的组件/元素类型,默认值设为Box本身,保留原有默认渲染行为 LabelProps类型做了三件事:- 剔除
BoxProps自带的as字段,单独定义更灵活的as属性 - 添加可选的
as属性,类型绑定泛型T - 合并目标组件
T的所有props,同时剔除和BoxProps重复的字段,避免类型冲突
- 剔除
使用示例
现在可以正常使用Button的variant属性了:
<Label as={Button} variant="ghost">ID</Label>
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

