Typescript -ts中对象类型的字符串url

nbnkbykc  于 2023-02-10  发布在  TypeScript
关注(0)|答案(1)|浏览(257)

如何在ts中将字符串url设置为对象类型?
样本代码:

type KeyUrl<T> = T extends `/${infer U}` ? U : never;
type TUrl<T> = { [k in KeyUrl<T>]: string };

// --------------------------------------------- this line work
const url = "/path";
const obj = {} as TUrl<typeof url>;
obj.path // work;

// --------------------------------------------- this line error
const url = "/path/path2";
const obj = {} as TUrl<typeof url>;
obj.path // Property 'path' does not exist;
obj.path2 // Property 'path2' does not exist;

谢谢。

new9mtju

new9mtju1#

您的问题是${infer U}是贪婪的,它吃掉了所有字符串。
所以对于/path/path2,它会得到整个字符串,因为它不会拆分它。在创建定义KeyUrl时,你需要考虑到这一点。

type KeyUrl<T> = T extends `/${infer U}/${infer R}` ? U | KeyUrl<`/${R}`> : T extends `/${infer U}` ? U : never

它的作用是获取path并检查是否存在一个或多个段,然后使用剩余路径调用KeyUrl
您可以在此处查看更复杂的示例

相关问题