Skip to content

Recursive solution for Transform Path Parameters from Strings to Objects #15

Description

@jbalsas

Hi @mattpocock!!

First of all, thanks so much for these materials you put together. I don't think I've become a wizard yet, but going through the topics and exercises has been quite fun and I feel like I've learned a lot from it already!! 🤯 😍

I just finished watching Transform Path Parameters from Strings to Objects. I didn't think to use the S.Split helper, so I came up with a recursive solution that felt easier to reason with (for me that I wrote it, of course! 😂)

Just pasting it here in case you think something like that might help others in the future and curious to know how you think it compares with the proposed solution ❤️

import { Equal, Expect } from '../helpers/type-utils';

type UserPath = '/users/:id';
type UserOrganisationPath = '/users/:id/organisations/:organisationId';
type UserOrganisationTeamPath =
  '/users/:id/organisations/:organisationId/teams/:teamId';

// Extracts param by param until the end 
type ExtractParams<T> = T extends `${string}:${infer Param}/${infer RestParams}`
  ? Param | ExtractParams<RestParams>
  : T extends `${string}:${infer Param}`
  ? Param
  : never;

type ExtractPathParams<T> = {
  [K in ExtractParams<T>]: string;
};

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions