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

TypeScript如何根据对象实际属性动态生成多条件if判断语句

TypeScript动态根据对象属性生成多条件判断实现方案

核心思路是抽离属性映射关系+遍历动态属性生成判断规则,不需要手动硬编码每一种if分支,根据传入params实际存在的属性自动适配判断条件,以下是两种可落地的实现:


方案1:运行时动态校验(推荐,业务场景首选)

这个方案不需要生成代码字符串,无安全风险,支持TS类型校验,适合绝大多数业务判断场景。

  1. 首先定义参数属性和待校验对象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'
}
  1. 封装通用匹配函数,自动遍历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()
  })
}
  1. 使用方式,不管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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:21:40