如何正确定义TypeScript泛型辅助函数以适配Setter类型?
问题分析与解决方案
你这里的核心问题是对Setter<S>的调用逻辑搞错了——你定义的Setter<S>是接收当前状态值,返回新状态值的函数,但你在test里给它传了一个更新函数,类型自然不匹配。
根据你的需求,这里提供两种适配原Setter类型的解决方案:
方案1:直接调用Setter更新foo属性
如果test的作用是调用传入的setter完成foo属性的更新,需要传入当前状态值,基于它生成符合类型要求的新状态:
type Setter<S> = (s: S) => S interface State { foo: number } declare const set: Setter<State> // 新增当前状态参数,确保能生成符合S类型的新状态 function test<S extends { foo: number }>(setter: Setter<S>, currentState: S) { return setter({ ...currentState, foo: 123 }) } // 调用时传入当前状态 test(set, { foo: 456 })
方案2:返回专门更新foo的Setter
如果test是要生成一个专注于更新foo属性的Setter函数,可以这样写:
type Setter<S> = (s: S) => S interface State { foo: number } declare const set: Setter<State> // 返回一个新的Setter,封装foo的更新逻辑 function test<S extends { foo: number }>(setter: Setter<S>) { return (currentState: S) => setter({ ...currentState, foo: 123 }) } // 生成更新foo的函数,传入当前状态即可执行 const updateFoo = test(set) updateFoo({ foo: 456 })
内容的提问来源于stack exchange,提问作者dhmk083
相关产品推荐
相关产品推荐

