TypeScript如何根据对象实际属性动态生成多条件if判断语句
TypeScript动态根据对象属性生成多条件判断实现方案
核心思路是抽离属性映射关系+遍历动态属性生成判断规则,不需要手动硬编码每一种if分支,根据传入params实际存在的属性自动适配判断条件,以下是两种可落地的实现:
方案1:运行时动态校验(推荐,业务场景首选)
这个方案不需要生成代码字符串,无安全风险,支持TS类型校验,适合绝大多数业务判断场景。
- 首先定义参数属性和待校验对象
test1的字段映射关系,和给出的示例规则对应:
interface EmailParams { sender?: string, subject?: string, fileType?: string } // key是EmailParams的属性,value是test1上对应的字段名 const PARAM_FIELD_MAP: Record<keyof EmailParams, string> = { sender: 'from', subject: 'data', fileType: 'fileType' // 按实际test1上的对应字段名修改即可 } const test1 = { from: 'xxx@gmail.com', data: 'test', fileType: 'pdf' }
- 封装通用匹配函数,自动遍历params的有效属性生成判断逻辑:
/** * 校验test1是否匹配传入的动态参数 * @param params 仅实际赋值、非空的属性会参与校验 */ function matchEmailParams(params: EmailParams): boolean { return Object.entries(params).every(([paramKey, paramValue]) => { // 空值不参与校验 if (paramValue == null) return true const test1Key = PARAM_FIELD_MAP[paramKey as keyof EmailParams] // 大小写不敏感匹配,和示例的toUpperCase逻辑完全一致 return test1[test1Key as keyof typeof test1]?.toUpperCase() === paramValue.toUpperCase() }) }
- 使用方式,不管params传几个属性,都不需要修改if判断代码:
let params: EmailParams = { sender: "test@gmail.com" } // 自动生成单条件判断,等价于示例里的单条件if if (matchEmailParams(params)) { // 业务逻辑 } params = { sender: "test@gmail.com", subject: "data" } // 自动变成双条件&&判断,等价于示例里的多条件if if (matchEmailParams(params)) { // 业务逻辑 }
这个方案的优势:
- 无代码注入风险,不需要用
eval等危险API执行动态字符串 - 全链路TS类型校验,字段写错会直接在编译阶段报错
- 扩展成本低,后续EmailParams新增属性,只需要在
PARAM_FIELD_MAP里加一行映射关系即可,不需要修改核心判断逻辑
方案2:动态生成if代码字符串(适合代码生成/低代码场景)
如果是做低代码平台、代码自动生成工具,确实需要输出可直接运行的if语句字符串,可以用下面的实现:
function generateIfCode(params: EmailParams): string { const conditionList: string[] = [] Object.entries(params).forEach(([paramKey, paramValue]) => { if (paramValue == null) return const test1Key = PARAM_FIELD_MAP[paramKey as keyof EmailParams] conditionList.push(`test1.${test1Key}.toUpperCase() == params.${paramKey}?.toUpperCase()`) }) // 无有效判断条件时默认返回true,避免语法错误 if (conditionList.length === 0) return 'if (true)' return `if (${conditionList.join(' &&\n ')})` }
测试输出效果:
- 传入只有sender的params时,输出和示例完全一致的单条件if代码
- 传入带sender、subject的params时,输出带&&连接的多条件if代码,和给出的示例格式完全匹配
注意:非代码生成场景不要用这个方案,拼接的代码字符串如果直接执行会存在注入风险,且无法被TS做静态校验,容易引发线上问题。
内容的提问来源于stack exchange,提问作者segmet
相关产品推荐
相关产品推荐

