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

TypeScript中如何让函数参数value与动态传入的key类型始终匹配

TypeScript 对象属性更新函数类型安全优化方案

核心实现思路

通过泛型约束绑定参数key与value的类型关系,让TypeScript自动根据传入的属性名,推断该属性允许的取值类型,不符合类型的传参会直接触发类型报错。

优化后的代码

// interface 
interface Frequency {
  frequency: "daily" | "monthly";
  sendHour: number;
  sendMinutes: number;
  sendDay: number;
  delayStart: boolean;
}

// react state
const [frequency, setFrequency] = useState<Frequency>({
  frequency: "daily",
  sendHour: 1,
  sendMinutes: 1,
  sendDay: 1,
  delayStart: false,
});

// 类型安全的updater
const onChangeFrequency = <K extends keyof Frequency>(
  key: K,
  value: Frequency[K]
) => {
  setFrequency((prev) => ({
    ...prev,
    [key]: value,
  }));
};

效果验证

  • 当传入key为delayStart时,value只能传入boolean类型,传入数字/字符串都会触发类型错误
  • 当传入key为frequency时,value只能传入"daily"或"monthly"两个枚举值
  • 所有属性的更新都会严格匹配Frequency接口定义的类型,完全规避类型不匹配的漏洞

通用封装方案(可选)

如果项目中有多个类似的状态需要更新,可以封装通用的类型,减少重复代码:

// 通用状态更新函数类型定义
type StateUpdater<T> = <K extends keyof T>(key: K, value: T[K]) => void;

// 针对Frequency类型的使用
const onChangeFrequency: StateUpdater<Frequency> = (key, value) => {
  setFrequency(prev => ({ ...prev, [key]: value }));
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:06:04