TypeScript中强类型实现嵌套对象特定key的唯一值获取
强类型实现嵌套规则集的唯一字段提取
需求说明
从n层级嵌套的ruleset对象中提取所有field键的唯一值,预期输出为['TierLevel', 'CompanyType', 'CompanyService', 'City', 'StateProvince', 'Country']。现有实现使用any类型,不符合TypeScript强类型要求,需重构为类型安全的方案。
强类型实现方案
首先定义递归类型约束规则集结构,确保类型安全:
// 基础规则(叶子节点:包含field的具体规则) type BaseRule<T extends string = string> = { field: T; operator: string; value: string | number; }; // 嵌套规则集(分支节点:包含condition和子规则列表) type RuleSet<T extends string = string> = { condition: 'and' | 'or'; rules: Array<BaseRule<T> | RuleSet<T>>; };
然后实现纯递归函数,无副作用地收集并去重字段:
function extractUniqueFields<T extends string>(ruleset: RuleSet<T>): T[] { // 内部递归收集字段的函数 const collectFields = (node: BaseRule<T> | RuleSet<T>): T[] => { // 判断当前节点是规则集还是基础规则 if ('rules' in node) { // 递归遍历所有子规则,合并结果 return node.rules.flatMap(collectFields); } else { // 返回当前基础规则的field return [node.field]; } }; // 收集所有字段后通过Set去重,再转回数组 const allFields = collectFields(ruleset); return [...new Set(allFields)]; }
使用示例
将示例规则集传入函数,即可得到预期的唯一字段列表:
const ruleset = { condition: 'and', rules: [ { field: 'TierLevel', operator: 'Equals', value: '1' }, { field: 'CompanyType', operator: 'Equals', value: '7' }, { field: 'CompanyService', operator: 'Equals', value: '23' }, { condition: 'or', rules: [ { field: 'City', operator: 'Contains', value: 'york' }, { field: 'City', operator: 'Contains', value: 'cal' } ] }, { condition: 'or', rules: [ { field: 'StateProvince', operator: 'Equals', value: '3171' }, { field: 'StateProvince', operator: 'Equals', value: '475' }, { condition: 'or', rules: [ { field: 'Country', operator: 'Equals', value: '224' }, { field: 'Country', operator: 'Equals', value: '1' } ] } ] } ] }; const uniqueFields = extractUniqueFields(ruleset); console.log(uniqueFields); // 输出: ['TierLevel', 'CompanyType', 'CompanyService', 'City', 'StateProvince', 'Country']
方案优势
- 强类型约束:通过递归类型
RuleSet和BaseRule避免any类型,编译阶段即可检测结构错误 - 纯函数设计:无外部副作用,逻辑清晰,易于测试和维护
- 自动类型推断:传入规则集时,函数会自动推断
field的联合类型,返回值类型精准
内容的提问来源于stack exchange,提问作者Shashikumar N
相关产品推荐
相关产品推荐

