Typescript 获取对象全部路径(包含深度路径)

279 阅读1分钟

这个类型定义中,通过 [K in keyof T]``,遍历了 T对象中的每个属性K,然后通过 K extends string ?来判断K是否为字符串类型,如果是,则继续判断T[K]是否是一个嵌套的对象类型,如果是,则返回K.{K}.{Path<T[K]>},这里使用了递归调用 Path<T[K]>来处理多层嵌套属性。如果T[K]不是嵌套的对象类型,则返回属性名K。如果 K不是字符串类型,则返回never`。

type Path<T> = {
  [K in keyof T]: K extends string
    ? T[K] extends Record<string, any>
      ? `${K}.${Path<T[K]>}`
      : K
    : never;
}[keyof T];

验证

interface IConfig {
  host: string;
  port: string;
  db: {
    host: string;
    port: number;
  }
}

type IConifgPath = Path<IConfig> // "host" | "port" | "db.host" | "db.port"