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

如何修复TypeScript中使用keyof类型定义时出现的“Argument of type 'string' is not assignable to parameter of type 'never'”错误

Fix TypeScript Error When Calling Typed Redux Action setProperty

这个问题其实是TypeScript在泛型参数推断上的小坑,我来帮你拆解下原因和解决办法:

问题根源

你当前定义的泛型<AppState, K extends keyof AppState>,当调用setProperty('data', computedData)时,TypeScript没办法自动把'data'识别为keyof AppState里的具体字面量类型,反而把它当成了宽泛的string类型。这就导致泛型约束失效,最终推断出K的类型是never,所以才会抛出那个奇怪的错误。

解决方案

这里有几种靠谱的修复方式,按优雅程度排序:

1. 简化泛型定义,让TypeScript自动推断

把动作的泛型参数调整为只约束K,去掉单独的AppState泛型参数(因为AppState是已知的全局类型):

setProperty: <K extends keyof AppState>(key: K, value: AppState[K]): void => {
  set({ [key]: value });
};

这样调用setProperty('data', computedData)时,TypeScript会直接根据传入的'data'字面量推断出K是'data',进而自动约束value必须是DataDTO类型,完美适配类型检查,而且代码更简洁。

2. 显式指定泛型参数(适合临时场景)

如果不想修改动作的定义,可以在调用时手动指定泛型参数,明确告诉TypeScriptK的具体类型:

setProperty<AppState, 'data'>('data', computedData);

这种方式虽然有效,但每次调用都要写泛型参数,比较繁琐,不是最优解。

3. 确保computedData的类型严格匹配DataDTO

有时候错误可能是因为computedData的类型不是严格的DataDTO(比如是any或者结构相似但类型不匹配的对象)。你可以检查computedData的类型定义,确保它完全符合DataDTO的结构。如果确实是类型推断的问题,也可以临时用类型断言(不推荐长期使用):

setProperty('data', computedData as DataDTO);

总结

最推荐第一种方法,调整泛型定义让TypeScript自动推断,既保持代码简洁,又能严格执行类型检查。

内容的提问来源于stack exchange,提问作者Mabeh Al-Zuq Yadeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:24:07