TypeScript数据库操作包装函数返回类型无法正确推断如何解决?
问题原因
原有代码的泛型定义存在关联缺失问题:
- 声明的泛型
Fn和入参fn的类型约束没有强绑定,TS无法自动将传入函数的返回值类型与泛型参数Data做关联推导 - 手动传入泛型的写法冗余,反而会干扰TS的自动类型推断
解决方案
1. 优化工具函数定义
调整A.ts中的泛型声明,让TS可以自动从入参函数中提取参数、返回值类型:
// File `A.ts` type PromiseReturnType<T = undefined> = { success: boolean, response: T } // 补全isConnected的类型声明(你原有代码中已定义该变量可忽略这行) declare let isConnected: boolean const DatabaseOperation = <Data, Fn extends (...args: any[]) => Promise<PromiseReturnType<Data>>>(fn: Fn) => { return async function (...args: Parameters<Fn>): Promise<PromiseReturnType<Data | Error>> { if (!isConnected) { // 建议从reject改为正常返回,符合你定义的PromiseReturnType语义,避免额外的try catch处理 return { success: false, response: new Error("Not connected to the Database!") } } return await fn(...args) } }
如果需要保留reject的写法,可以将返回值做类型断言即可:
const DatabaseOperation = <Data, Fn extends (...args: any[]) => Promise<PromiseReturnType<Data>>>(fn: Fn) => { return async function (...args: Parameters<Fn>): Promise<PromiseReturnType<Data>> { if (!isConnected) { return Promise.reject({ success: false, response: new Error("Not connected to the Database!") }) as Promise<PromiseReturnType<Data>> } return await fn(...args) } }
2. 简化调用方式
调整B.ts的调用逻辑,不需要手动传入泛型参数,TS会自动完成类型推断:
// File `B.ts` const dbOperation = async (myArg: number): Promise<PromiseReturnType<string>> => { return Promise.resolve({ success: true, response: `hello world ${myArg}` }) } // 无需手动传入泛型,自动推断类型 export default DatabaseOperation(dbOperation)
3. 验证类型推断
调用时即可得到正确的类型提示:
import dbOperation from "B.ts" (async function () { // 此时类型推断为:dbOperation(myArg: number): Promise<PromiseReturnType<string | Error>> const res = await dbOperation(123) if (res.success) { // 此处res.response会自动推断为string类型 console.log(res.response) } else { // 此处res.response会自动推断为Error类型 console.log(res.response.message) } })()
更优实现说明
推荐将连接错误改为正常返回而非reject的方式,和你定义的PromiseReturnType结构完全统一,调用方不需要额外处理异常捕获,直接通过success字段判断状态即可,类型推导也会更精准。
内容的提问来源于stack exchange,提问作者lsc
相关产品推荐
相关产品推荐

