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

如何为含And/Or无限嵌套结构编写TypeScript接口

TypeScript 嵌套条件结构的接口定义

需要定义的JSON结构中,Condition字段下必须包含And或Or;And/Or内部既可以是另一个And/Or嵌套结构,也可以是userData: UserType[]数组。

正确的接口实现代码

// 定义userData的元素类型
interface UserType {
  name: string;
  age: string;
}

// 操作符类型枚举
type Operator = 'And' | 'Or';

// 递归类型:支持嵌套And/Or,或直接包含userData
type ConditionNode = {
  [K in Operator]?: ConditionNode | { userData: UserType[] };
};

// 顶层结构:必须包含Condition字段
interface RootCondition {
  Condition: ConditionNode;
}

验证示例

// 符合约束的示例数据
const validCondition: RootCondition = {
  "Condition": {
    "And": {
      "Or": {
        "userData": [
          { "name": "Alex", "age": "65" },
          { "name": "Peter", "age": "34" }
        ]
      }
    },
    "Or": {
      "userData": [
        { "name": "Alex", "age": "65" },
        { "name": "Peter", "age": "34" }
      ]
    }
  }
};

关键说明

  • 递归类型ConditionNode:利用TypeScript递归特性,让And/Or的值既可以是自身(实现多层嵌套),也可以是携带userData的对象,完全匹配需求中的两种结构。
  • 顶层RootCondition:明确限定了最外层必须存在Condition字段,其值为嵌套结构的入口。
  • 可选属性设计:And/Or的?标记允许单个操作符存在,也支持同时包含两个操作符,覆盖了场景中的所有合法情况。

可选:强制至少包含一个操作符

如果需要限制ConditionNode不能是空对象,必须存在And/Or中的至少一个,可以调整为以下类型:

type ConditionNode = 
  // 仅包含And
  ({ And: ConditionNode | { userData: UserType[] } } & Partial<Record<Operator, never>>) |
  // 仅包含Or
  ({ Or: ConditionNode | { userData: UserType[] } } & Partial<Record<Operator, never>>) |
  // 同时包含And和Or
  ({ 
    And: ConditionNode | { userData: UserType[] }, 
    Or: ConditionNode | { userData: UserType[] } 
  });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:27:28