首页 > 其他分享 >[Typescript] Key in union type

[Typescript] Key in union type

时间:2022-12-14 15:33:55浏览次数:32  
标签:Typescript union number Split Key array type id

Let's say we want to extract query param from string:

type UserPath = "/users/:id";

type UserOrganisationPath = "/users/:id/organisations/:organisationId";

So that:

type tests = [
  Expect<Equal<PathParamsObj<UserPath>, { id: string }>>,
  Expect<
    Equal<
      PathParamsObj<UserOrganisationPath>,
      { id: string; organisationId: string }
    >
  >
];

 

Sotuion by using ts-toolbelt

type PathParamsObj<TPath extends string> = {
  [Key in S.Split<TPath, "/">[number] as Key extends `:${infer Param}`
    ? Param
    : never]: string;
};

 

Notice that Key in S.Split<TPath, "/">[number], need to understand that why we need to add [number], inside of just Key in S.Split<TPath, "/">

 

In javascript

inoperator can be used to map over an array:

const nums = [1,2,3]
for (let num in nums) {
 console.log(num) // log out 0,1,2, indexes
}

 

In Typescript

When using inwith types, it needs to map over union type instead of array

What S.Split<TPath, "/">returns is array, to convert array to union, array[number]results into union type:

S.Split<TPath, "/"> // ["", "users", ":id"]
S.Split<TPath, "/">[number] //"" | "users" | ":id"

 

标签:Typescript,union,number,Split,Key,array,type,id
From: https://www.cnblogs.com/Answer1215/p/16982304.html

相关文章