如何在TypeScript中生成不含最深子节点的点符号类型路径
TypeScript生成排除最深层级的嵌套对象点符号类型字符串
需求是生成嵌套对象的点符号类型字符串,但要排除最深的子节点(即只保留直接包含string类型属性的父节点路径)。现有方案会生成带${string}的路径,需要调整实现来达到预期结果。
示例对象类型
type TranslationType = { key1: { en: string, } sub: { key2: { en: string, } } }
修改后的类型实现
// 判断当前节点是否是直接包含string属性的父节点 type IsLeafParent<T> = T extends Record<string, string> ? true : false; // 递归生成路径数组 type PathsToStringProps<T> = { [K in Extract<keyof T, string>]: IsLeafParent<T[K]> extends true ? [K] // 若当前节点的子节点是string,停止递归,仅保留当前节点路径 : [K, ...PathsToStringProps<T[K]>] // 否则继续递归子节点 }[Extract<keyof T, string>] // 将路径数组拼接为点符号字符串 type Join<T extends string[]> = T extends [] ? never : T extends [infer F] ? F : T extends [infer F, ...infer R] ? F extends string ? `${F}.${Join<Extract<R, string[]>>}` : never : string // 测试:得到预期的 "key1" | "sub.key2" let value: Join<PathsToStringProps<TranslationType>>;
关键改动说明
- 新增
IsLeafParent类型,用于识别那些直接包含string类型属性的父节点。 - 调整
PathsToStringProps的递归逻辑:当检测到当前节点是IsLeafParent时,不再继续递归其子节点,直接将当前节点作为路径的终点。 - 原
Join类型无需改动,依然负责将路径数组拼接为点符号格式的字符串。
内容的提问来源于stack exchange,提问作者TheWuif
相关产品推荐
相关产品推荐

