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 } } }
修改说明
- 无参success调用适配:通过重载区分有参、无参场景,无参调用时返回的成功对象不携带
value字段,符合你定义的ResultSuccess<void>类型,TS会在成功分支直接提示value属性不存在,不会再出现unknown类型的问题。 - 失败场景类型窄化问题:你遇到的
!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
相关产品推荐
相关产品推荐

