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

TypeScript中ResultCreator的success方法如何支持void无参调用

解决方案

代码修改

你只需要调整ResultCreator类的实现,给success方法增加重载适配无参场景,同时优化泛型默认值即可:

export class ResultCreator {
  // 无参调用重载,适配void返回
  static success(): Result<void>
  // 有参调用重载,适配带value的返回
  static success<T>(value: T): Result<T>
  static success<T>(value?: T): Result<T> | Result<void> {
    // 无参数时不返回value字段,匹配void类型的ResultSuccess定义
    if (value === undefined) {
      return { isSuccess: true } as Result<void>
    }
    return { isSuccess: true, value } as Result<T>
  }

  // 给failure泛型增加never默认值,无需手动指定泛型即可正常推导
  static failure<T = never>(errorValue: string): Result<T> {
    return { isSuccess: false, error: errorValue }
  }
}

修改说明

  1. 无参success调用适配:通过重载区分有参、无参场景,无参调用时返回的成功对象不携带value字段,符合你定义的ResultSuccess<void>类型,TS会在成功分支直接提示value属性不存在,不会再出现unknown类型的问题。
  2. 失败场景类型窄化问题:你遇到的!errorResult.isSuccess无法识别error属性的问题是TS 4.8版本以下的控制流分析限制,两种解决方式:
    • 升级到TS 4.8及以上版本,官方已经优化了布尔值取反的类型窄化逻辑,可直接正常识别
    • 无需升级的情况下,统一使用if (errorResult.isSuccess === false)做判断,全版本TS都能正常触发类型窄化

效果验证

修改后使用效果完全符合你的预期:

const emptyResult = ResultCreator.success();
if (emptyResult.isSuccess) {
  emptyResult.value // TS直接报错:属性“value”不存在于类型{ isSuccess: true }
}

const result = ResultCreator.success('my value');
if (result.isSuccess) {
  result.value // 正常识别为string类型
}

const errorResult = ResultCreator.failure('failure');
if (!errorResult.isSuccess) { // TS 4.8+ 正常窄化
  errorResult.error // 类型识别为string
}

if (errorResult.isSuccess === false) { // 全版本兼容
  errorResult.error // 类型识别为string
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:51:00