-
Notifications
You must be signed in to change notification settings - Fork 134
/
09-router.solutions.ts
100 lines (100 loc) · 2.38 KB
/
09-router.solutions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**
* #1
*
* 💡 First, you can't pass an invalid route to the
* first argument.
*
* const routes = makeRouter({
* "/": {},
* });
*
* routes.goTo("/users");
* ^ ⛔️
*
* Second, you get autocomplete on the search parameters
* that you specify in the array in makeRoutes.
*
* Third, you can't pass a second argument to routes.goTo at
* all if you haven't specified a search param on that route.
*
* const routes = makeRouter({
* "/": {},
* });
*
* routes.goTo("/", {});
* ^ ⛔️
*
* #2
*
* const makeRouter2 = <TConfig>(config: TConfig) => {
* return {
* config,
* goTo: (route: keyof TConfig) => {},
* };
* };
*
* #3
*
* 💡 This is failing because we haven't constrained TConfig
* properly. Add TConfig extends BaseRouterConfig to get it to
* work.
*
* const makeRouter2 = <TConfig extends BaseRouterConfig>(config: TConfig) => {
*
* #4
*
* 💡 Two solutions come to mind here. Either:
*
* type TupleToSearchParams<TTuple extends string[]> = Partial<
* Record<TTuple[number], string>
* >;
*
* This makes use of the Partial and Record types.
*
* OR:
*
* type TupleToSearchParams<TTuple extends string[]> = {
* [SearchParam in TTuple[number]]?: string;
* };
*
* #5
*
* ⛔️ This error is happening because in BaseRouterConfig, we specify
* that search can be undefined. We're doing that via the ?: operator.
*
* The issue is that inside TupleToSearchParams, we've specified
* that the TTuple MUST be string[]. You can't pass undefined into
* that slot. We need to resolve this somehow.
*
* #6
*
* goTo: <TRoute extends keyof TConfig>(
* route: TRoute,
* search?: TConfig[TRoute]["search"] extends string[]
* ? TupleToSearchParams<TConfig[TRoute]["search"]>
* : undefined,
* ) => {},
*
* #7
*
* getSearch: <TRoute extends keyof TConfig>(
* route: TRoute,
* ): TConfig[TRoute]["search"] extends [string, ...string[]]
* ? TupleToSearchParams<TConfig[TRoute]["search"]> | undefined
* : undefined => {
* // Runtime: Grab the search params from the route
*
* return undefined;
* },
*
* #8
*
* There are several solutions to this, but here's mine:
*
* goTo: <TRoute extends keyof TConfig>(
* route: TRoute,
* search?: TConfig[TRoute]["search"] extends [string, ...string[]]
* ? TupleToSearchParams<TConfig[TRoute]["search"]>
* : undefined,
* ) => {},
*/