我有过

type Route = {
  path: string
  children?: readonly Route[]
}

const root = {
  path: "a",
  children: [
    { path: "b" },
    { path: "c", children: [{ path: "d", children: [{ path: "e" }] }] }
  ],
} as const satisfies Route;

我想定义一个类型脚本泛型Convert,这样Convert<typeof root>的输出就是字符串枚举‘a’|‘a/b’|‘a/c’|‘a/c/d’|‘a/c/d/e’

type Convert<T extends Route> = ?

我试过像这样的东西

type Convert<T extends Route, Prefix extends string = ''> = 
`${Prefix}/${T['path']}` | (
    T["children"] extends readonly Route[]
      ? {
        [K in number]: Convert<T['children'][K], `${Prefix}/${T['path']}`>;
      }[number]
      : never)

但是输出="/a"|"/a/b"|"/a/c"还不够深入.

https://www.typescriptlang.org/play?#code/C4TwDgpgBASg9gV2NAvFA3gWAFBSmAQ2AAsAuKAZ2ACcBLAOwHMc8BjY2gGwBNqJ6A-OT4FucepxCxEyANoBdHAF8cOVuKpRqcOMChosufETJQARATMAaFlHZde-crNt50xkuTMAjM1CU2Rm4epmas1nYcPHz0zu6EnubcEfbRTlCy8SZeEH5K8v4FKkbygUpQBBR2GnoURLQUAGa0EFXwSBAA3KrYoJBQAKIAHpCsemgA5AQTUAA+UFMA9N4z80vei6yrCwTLm4vc2+v73IsQEz190ADC4gBuENTAADwAKlAQQ8j03G0yEFYoAAFPjNIYfL78X6UGgMRj6BYTAB8CJwAAMACToEEQMFKRZY16yCYJYgTeRKNFzKAAClcUCJYSijnoZgKn2+0JEYgkUnackUQTwUAEGHpwoyAGkoAwoPQEABbbyPeTkW70B5PN7E1Is8mySWlKCY7Gg2hDfGE4mk8mUpHdIV4JSyeVKlXiqDkegQTUASku4Ggw0IP2eAA0UWgwxDOVUEPQANb0OAAd3oIqg0a9PseDquUAA8kgwEgEcGCKH1ZqXlc4I0tDpgEikUA

感谢您的帮助!

推荐答案

毫无疑问,有很多方法可以做到这一点.这里有一个:

type Convert<T extends Route> =
  T['path'] | (
    T extends { children: readonly (infer R extends Route)[] } ?
    `${T['path']}/${Convert<R>}` : never
  );

我要做的就是输出path属性,然后递归地获取R,children属性中Routeunion,然后应用Convert<R>...并将其附加到path属性后加一个斜杠.

让我们确保它起作用:

type Expect = 'a' | 'a/b' | 'a/b/c' | 'a/b/c/d' | 'a/b/c/d/e'
type Actual = Convert<typeof root>;
// type Actual = "a" | "a/b" | "a/c" | "a/c/d" | "a/c/d/e"

看上go 不错.

Playground link to code

Typescript相关问答推荐

实现忽略了JSSOM中的doctor.body.innerHTML集

TypScript如何在 struct 上定义基元类型?

TypScript手册中的never[]参数类型是什么意思?

在类型内部使用泛型类型时,不能使用其他字符串索引

为什么typescript要把这个空合并转换成三元?

如何在TypeScrip面向对象程序设计中用方法/属性有条件地扩展类

单击并移除for循环中的一项也会影响另一项

根据上一个参数值查找参数类型,也返回类型

根据另一个属性的值来推断属性的类型

在嵌套属性中使用Required

React Typescript项目问题有Redux-Toolkit userSlice角色问题

Cypress页面对象模型模式.扩展Elements属性

在HighChats列时间序列图中,十字准线未按预期工作

@TANSTACK/REACT-QUERY中发生Mutations 后的数据刷新问题

判断映射类型内的键值的条件类型

API文件夹内的工作员getAuth()帮助器返回:{UserID:空}

接口中可选嵌套属性的类型判断

递归类型别名的Typescript 使用

如何以类型安全的方式指定键的常量列表,并从该列表派生所挑选的接口?

换行TypeScript';s具有泛型类型的推断数据类型