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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:35:16