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
in
operator 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 in
with 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