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

如何类型安全地构造兼具元组与对象属性的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:05:27