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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:18:04