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

