如何在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
相关产品推荐
相关产品推荐

