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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:51:00