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

如何修正TypeScript中Dao泛型函数的返回类型推导问题?

如何修正TypeScript中Dao类型定义以实现正确的返回类型推断?

需求背景

  • dao供管理员或普通用户使用,每个方法的第一个参数需传入isAdmin: boolean(示例:updateUser(isAdmin: boolean, returnUser))
  • daoAsAdmin提供无需传入isAdmin参数的调用接口,内部自动注入isAdmin = true(示例:updateUser(returnUser))

现有代码示例

type User = { name: string }

type DaoAsAdmin = {
    updateUser<ReturnUser extends boolean>(
        returnUser: ReturnUser
    ): ReturnUser extends true ? User : string
}

type Dao = {
    // 为所有dao方法注入isAdmin作为第一个参数
    [K in keyof DaoAsAdmin]: (isAdmin: boolean, ...params: Parameters<DaoAsAdmin[K]>) => ReturnType<DaoAsAdmin[K]>
}

// 实际实现代码
const dao: Dao = {
    updateUser(isAdmin, returnUser) {
      throw 'not implemented'
    }
}

// 通过Proxy自动注入isAdmin = true到dao方法的第一个参数
const daoAsAdmin = new Proxy(dao, {
    get(target, prop, receiver) {
        return function (...params) {
            const NEW_PARAMS = [true, ...params]
            return target[prop](...NEW_PARAMS)
        }
    },
}) as DaoAsAdmin

// daoAsAdmin调用类型正常
const userAsAdmin = daoAsAdmin.updateUser(true) // 类型为User,符合预期
const userStringAsAdmin = daoAsAdmin.updateUser(false) // 类型为string,符合预期

// dao调用类型异常
const user = dao.updateUser(false, true) // 实际类型为string | User,预期为User
const userAsStr = dao.updateUser(false, false) // 实际类型为string | User,预期为string

问题核心

尝试多种方法后,仍无法让dao的方法根据传入的参数返回正确类型。需要结合Parameters和ReturnType实现动态类型推断,但目前找不到可行的类型定义方式。

需要修改Dao的类型定义以满足预期需求,且必须单独声明类型与常量,实际场景更为复杂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:35:57