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

如何正确定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:27:44