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

如何使用TypeScript的Awaited工具类型处理两种返回对象类型

修正代码并结合Awaited工具类型实现

1. 先修复原代码的基础错误

原代码存在Promise逻辑错误、变量未定义等问题,先做基础修正:

// 自定义错误类型改名,避免和全局Error冲突
type ApiError = { error_code: number, error_message: string }

export type Response = {
    template_id: number
    user_msg: string
    ssboe: number
    usecs: number
}

// 修复Promise的resolve/reject逻辑,补充缺失变量
export function Heartbeat(usecs: number, ssboe: number): Promise<Response> {
    return new Promise((resolve, reject) => {
        try {
            // 示例赋值template_id和user_msg
            resolve({ 
                template_id: 1, 
                ssboe, 
                usecs, 
                user_msg: "心跳响应成功" 
            });
        } catch (err) {
            reject({
                error_code: 1,
                error_message: err instanceof Error ? err.message : '未知错误'
            } as ApiError);
        }
    });
}

2. 结合Rust风格Result类型与Awaited

如果要实现类似Rust的Result<T, E>(monad模式),可以先定义Result类型,再用Awaited提取异步结果类型:

type ApiError = { error_code: number, error_message: string }

export type Response = {
    template_id: number
    user_msg: string
    ssboe: number
    usecs: number
}

// 定义Rust风格的Result联合类型,明确区分成功/失败
type Result<T, E> = { ok: T, err?: never } | { err: E, ok?: never }

// 改造函数,返回封装后的Promise
export function Heartbeat(usecs: number, ssboe: number): Promise<Result<Response, ApiError>> {
    return new Promise((resolve) => {
        try {
            // 模拟成功场景
            resolve({
                ok: { 
                    template_id: 1, 
                    ssboe, 
                    usecs, 
                    user_msg: "心跳响应成功" 
                }
            });
            // 模拟失败可注释上面,打开下面
            // throw new Error("请求超时");
        } catch (err) {
            resolve({
                err: {
                    error_code: 1,
                    error_message: err instanceof Error ? err.message : '未知错误'
                }
            });
        }
    });
}

// 使用Awaited提取Promise解析后的最终类型
type HeartbeatFinalResult = Awaited<ReturnType<typeof Heartbeat>>
// 此时HeartbeatFinalResult等价于Result<Response, ApiError>

3. Awaited工具类型的实际用法

Awaited的核心作用是提取Promise最终解析的类型,比如:

  • Awaited<Promise<string>> 等价于 string
  • Awaited<Promise<Promise<number>>> 等价于 number
  • 对上面的Promise<Result<Response, ApiError>>,Awaited会直接提取出Result<Response, ApiError>

实际调用示例:

async function callHeartbeat() {
    const result = await Heartbeat(1000, 1);
    if ('ok' in result) {
        console.log("成功响应:", result.ok);
    } else {
        console.error("请求失败:", result.err);
    }
}

callHeartbeat();

关键说明

  • 自定义错误类型避免和全局Error重名,防止类型冲突
  • Rust风格的Result通过联合类型实现,封装了成功/失败的状态,符合monad的设计思想
  • Awaited适合在类型定义阶段提前明确异步操作的最终返回类型结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:22:27