如何类型安全地构造兼具元组与对象属性的Result实例?
类型安全构造Result实例的方案
你定义的Result是元组与对象类型的交叉类型,要求实例同时具备数组结构和指定的对象属性。直接赋值元组会报错,因为元组本身没有errors和success属性,无法满足交叉类型的全部要求。以下是几种更优的类型安全构造方式:
1. 用Object.assign一步构造
Object.assign可以把对象属性合并到数组实例上,TypeScript能正确推导合并后的类型符合Result要求:
type Errors = Record<string, string | null>; type Result = [Errors, boolean] & { errors: Errors; success: boolean }; // 假设已有定义的errors和success变量 const errors: Errors = { email: "格式错误" }; const success = false; // 一步构造类型安全的Result实例 const result: Result = Object.assign([errors, success], { errors, success });
2. 封装工厂函数
把构造逻辑封装成函数,内部仅做一次断言,外部调用全程类型安全,还能复用逻辑:
type Errors = Record<string, string | null>; type Result = [Errors, boolean] & { errors: Errors; success: boolean }; function createResult(errors: Errors, success: boolean): Result { const baseResult = [errors, success] as [Errors, boolean]; baseResult.errors = errors; baseResult.success = success; return baseResult as Result; } // 使用示例 const errors: Errors = { password: "长度不足" }; const result = createResult(errors, false); // 支持两种解构方式 const [errs, isSuccess] = result; const { errors: objErrs, success: objSuccess } = result;
3. 用Partial<Result>替代any
如果需要分步赋值,用Partial<Result>代替any,既能限制属性类型,又避免不安全的any:
type Errors = Record<string, string | null>; type Result = [Errors, boolean] & { errors: Errors; success: boolean }; const errors: Errors = {}; const success = true; const result = [errors, success] as Partial<Result>; result.errors = errors; result.success = success; const finalResult = result as Result;
以上几种方式都能避免使用any,保证类型安全,同时满足数组解构和对象解构的需求。
内容的提问来源于stack exchange,提问作者Dusan
相关产品推荐
相关产品推荐

