如何使用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>>等价于stringAwaited<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
相关产品推荐
相关产品推荐

