为何出现‘string类型参数无法赋值给SetStateAction<V>类型’错误?
类型错误:"string"类型参数无法赋值给"SetStateAction"的原因与修复
错误原因
核心问题出在泛型参数的传递和约束偏差:
- 虽然你在
IFormSelect接口里把泛型V的默认值设为any,但FormSelect组件将接口的第三个泛型参数绑定到了自身的泛型U上。如果组件被使用时,TypeScript根据上下文推断出U的具体类型(非any或string),就会导致setValue的参数类型不兼容。 - 你直接给
setValue传递字符串'hello',但setValue的类型是Dispatch<SetStateAction<V>>,若V被推断为非字符串类型(比如和IOption关联的类型),必然触发类型错误。
修复方案
方案1:修正泛型对应关系,确保V类型灵活可控
调整组件的泛型定义,让它完整对应接口的三个泛型参数,避免固定绑定某个具体类型:
const FormSelect = <T extends FieldValues, U extends IOption = IOption, V = any>({ control, defaultValue, name, options, placeholder, formatOptions, setValue }: IFormSelect<T, U, V>) => { return ( <div className='w-96 z-[41]'> <Controller control={control} name={name} defaultValue={defaultValue} render={({ field: { value, onChange, ref } }) => ( <Select ref={ref} options={options} value={options.filter(option => typeof value === 'string' && value.includes(option.value))} onChange={(val) => { onChange(val?.value); if (setValue && val?.value) setValue('hello'); }} placeholder={placeholder} formatOptionLabel={formatOptions} /> )} /> </div> ); };
方案2:约束V为字符串类型(适配固定业务场景)
如果业务中setValue只会接收字符串,直接在接口或组件调用时明确约束:
// 方式1:修改接口默认泛型 export interface IFormSelect< T extends FieldValues, U extends IOption = IOption, V = string > { control: Control<T, any>; name: keyof T; defaultValue?: string; placeholder?: string; options: U[]; formatOptions?: (data: U, formatOptionLabelMeta: FormatOptionLabelMeta<U>) => ReactNode; setValue?: Dispatch<SetStateAction<V>>; } // 方式2:使用组件时显式指定泛型 <FormSelect<IOrderForm, IOption, string> control={yourControl} name={yourFieldName} options={yourOptions} setValue={yourSetStateFn} />
方案3:临时类型断言(应急用,不推荐)
若暂时无法调整泛型结构,可通过类型断言绕过检查,但会丢失类型安全性:
if (setValue && val?.value) setValue('hello' as unknown as V);
内容的提问来源于stack exchange,提问作者don dalladon
相关产品推荐
相关产品推荐

