将对象Map到Typescript类型中的点符号字符串,但忽略最深子级

waxmsbnn  于 2023-05-08  发布在  TypeScript
关注(0)|答案(1)|浏览(128)

我试图得到正确的typescript类型作为点符号,但没有最深的孩子。
我在这里找到了我的解决方案的一半:但这并不包括省略最深的孩子。
下面是一个例子:

type TranslationType = {
  key1: {
    en: string,
  }
  sub: {
    key2: {
      en: string,
    }
  }
}

type PathsToStringProps<T> = T extends string
  ? []
  : {
      [K in Extract<keyof T, 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

let value: Join<PathsToStringProps<TranslationType> // "key1.${string}" | "sub.key2.${string}"

我得到"key1.${string}" | "sub.key2.${string}",但我希望它是"key1" | "sub.key2"

g52tjvyc

g52tjvyc1#

这不是我写的最好的 typescript ,但它的工作

type Join<T extends string[]> = T extends [string]
  ? never
  : T extends [infer F, ...infer R]
  ? F extends string
    ? Join<Extract<R, string[]>> extends never
      ? `${F}`
      : `${F}.${Join<Extract<R, string[]>>}`
    : never
  : string;

相关问题