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

如何在TypeScript中通过for循环安全地在对象间赋值?

解决方案

针对你的TypeScript类型转换问题,这里提供两种既符合类型安全要求、又避免重复代码且性能友好的实现方式:

方案一:精准类型断言快速修复

利用TypeScript的类型断言,明确告诉编译器非c键的属性类型是匹配的,无需额外分支判断:

type A = {
  a?: number
  b?: string
  c?: boolean
}

type B = {
  a?: number
  b?: string
  c?: string
}

function f(a: A): B {
  const b: B = {}
  for (const key of Object.keys(a) as Array<keyof A>) {
    if (key === 'c') {
      // 单独处理boolean转string的逻辑
      b.c = String(a[key])
    } else {
      // 断言为对应键的B类型,编译器能识别类型匹配
      b[key] = a[key] as B[typeof key]
    }
  }
  return b
}

这个方案保留了你原有的循环逻辑,仅通过一行断言解决类型报错,代码简洁且性能无损耗。

方案二:基于转换规则的可扩展实现

如果后续需要新增更多属性转换逻辑,推荐使用转换规则映射的方式,完全符合开闭原则,新增属性时只需添加规则而无需修改循环逻辑:

type A = {
  a?: number
  b?: string
  c?: boolean
}

type B = {
  a?: number
  b?: string
  c?: string
}

// 定义A到B的属性转换规则,每个键对应专属转换函数
const transformRules: {
  [K in keyof A]: (value: A[K]) => B[K]
} = {
  a: (val) => val, // 类型直接匹配,无需转换
  b: (val) => val,
  c: (val) => String(val) // boolean转string
}

function f(a: A): B {
  const b: B = {}
  for (const key of Object.keys(a) as Array<keyof A>) {
    const value = a[key]
    // 仅同步已赋值的属性
    if (value !== undefined) {
      b[key] = transformRules[key](value)
    }
  }
  return b
}

优势说明

  • 类型安全:TypeScript会严格校验转换函数的输入输出类型,避免转换错误
  • 可扩展性:新增属性时只需在transformRules中添加对应转换逻辑,无需修改循环代码
  • 性能友好:直接循环赋值,无临时对象创建,完全满足性能敏感场景需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:36:18