TypeScript中能否基于部分参数推导其余参数的类型
TypeScript 关联参数类型推导实现方案
TypeScript 完全支持基于部分参数类型推导另一部分参数类型的需求,你遇到的场景可以通过泛型约束实现,同时你示例中原代码还存在对象动态键的语法错误,修复后的完整实现如下:
type FormValues = { name: string; height: number; birthDate: Date; } const [value, setValue] = useState<Partial<FormValues>>({}); // 泛型K关联两个参数的类型关系 const setFieldValue = <K extends keyof FormValues>(field: K, value: FormValues[K]) => { // 动态键需要用方括号包裹,否则会被识别为固定名为field的属性 setValue(prev => ({ ...prev, [field]: value })); }
实现后类型校验效果:
- 调用
setFieldValue('name', '张三')类型校验正常通过 - 调用
setFieldValue('name', 180)会触发TS类型报错,提示value参数需要匹配string类型 - 调用
setFieldValue('height', 180)类型校验正常通过 - 调用
setFieldValue('birthDate', new Date())类型校验正常通过
如果需要做通用的表单字段设置工具,无需绑定固定的FormValues类型,可以封装为更高阶的通用函数:
// 通用工具函数,表单值类型可以在使用时传入 const createSetFieldValue = <T extends Record<string, any>>( setValue: React.Dispatch<React.SetStateAction<Partial<T>>> ) => { return <K extends keyof T>(field: K, value: T[K]) => { setValue(prev => ({ ...prev, [field]: value })); } } // 使用时指定表单类型即可 const setFieldValue = createSetFieldValue<FormValues>(setValue);
内容的提问来源于stack exchange,提问作者omid.n
相关产品推荐
相关产品推荐

