如何修正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
相关产品推荐
相关产品推荐

