1 | import type { Middleware, StoreEnhancer } from 'redux'
|
2 | import type { MiddlewareArray } from './utils'
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | export type IsAny<T, True, False = never> =
|
11 |
|
12 | true | false extends (T extends never ? true : false) ? True : False
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | export type IsUnknown<T, True, False = never> = unknown extends T
|
21 | ? IsAny<T, False, True>
|
22 | : False
|
23 |
|
24 | export type FallbackIfUnknown<T, Fallback> = IsUnknown<T, Fallback, T>
|
25 |
|
26 |
|
27 |
|
28 |
|
29 | export type IfMaybeUndefined<P, True, False> = [undefined] extends [P]
|
30 | ? True
|
31 | : False
|
32 |
|
33 |
|
34 |
|
35 |
|
36 | export type IfVoid<P, True, False> = [void] extends [P] ? True : False
|
37 |
|
38 |
|
39 |
|
40 |
|
41 | export type IsEmptyObj<T, True, False = never> = T extends any
|
42 | ? keyof T extends never
|
43 | ? IsUnknown<T, False, IfMaybeUndefined<T, False, IfVoid<T, False, True>>>
|
44 | : False
|
45 | : never
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 | export type AtLeastTS35<True, False> = [True, False][IsUnknown<
|
56 | ReturnType<<T>() => T>,
|
57 | 0,
|
58 | 1
|
59 | >]
|
60 |
|
61 |
|
62 |
|
63 |
|
64 | export type IsUnknownOrNonInferrable<T, True, False> = AtLeastTS35<
|
65 | IsUnknown<T, True, False>,
|
66 | IsEmptyObj<T, True, IsUnknown<T, True, False>>
|
67 | >
|
68 |
|
69 |
|
70 |
|
71 |
|
72 | export type UnionToIntersection<U> = (
|
73 | U extends any ? (k: U) => void : never
|
74 | ) extends (k: infer I) => void
|
75 | ? I
|
76 | : never
|
77 |
|
78 |
|
79 | export type ExcludeFromTuple<T, E, Acc extends unknown[] = []> = T extends [
|
80 | infer Head,
|
81 | ...infer Tail
|
82 | ]
|
83 | ? ExcludeFromTuple<Tail, E, [...Acc, ...([Head] extends [E] ? [] : [Head])]>
|
84 | : Acc
|
85 |
|
86 | type ExtractDispatchFromMiddlewareTuple<
|
87 | MiddlewareTuple extends any[],
|
88 | Acc extends {}
|
89 | > = MiddlewareTuple extends [infer Head, ...infer Tail]
|
90 | ? ExtractDispatchFromMiddlewareTuple<
|
91 | Tail,
|
92 | Acc & (Head extends Middleware<infer D> ? IsAny<D, {}, D> : {})
|
93 | >
|
94 | : Acc
|
95 |
|
96 | export type ExtractDispatchExtensions<M> = M extends MiddlewareArray<
|
97 | infer MiddlewareTuple
|
98 | >
|
99 | ? ExtractDispatchFromMiddlewareTuple<MiddlewareTuple, {}>
|
100 | : M extends ReadonlyArray<Middleware>
|
101 | ? ExtractDispatchFromMiddlewareTuple<[...M], {}>
|
102 | : never
|
103 |
|
104 | export type ExtractStoreExtensions<E> = E extends any[]
|
105 | ? UnionToIntersection<E[number] extends StoreEnhancer<infer Ext> ? Ext extends {} ? Ext : {} : {}>
|
106 | : {}
|
107 |
|
108 |
|
109 |
|
110 |
|
111 |
|
112 |
|
113 |
|
114 |
|
115 | export type NoInfer<T> = [T][T extends any ? 0 : never]
|
116 |
|
117 | export type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>
|
118 |
|
119 | export interface TypeGuard<T> {
|
120 | (value: any): value is T
|
121 | }
|
122 |
|
123 | export interface HasMatchFunction<T> {
|
124 | match: TypeGuard<T>
|
125 | }
|
126 |
|
127 | export const hasMatchFunction = <T>(
|
128 | v: Matcher<T>
|
129 | ): v is HasMatchFunction<T> => {
|
130 | return v && typeof (v as HasMatchFunction<T>).match === 'function'
|
131 | }
|
132 |
|
133 |
|
134 | export type Matcher<T> = HasMatchFunction<T> | TypeGuard<T>
|
135 |
|
136 |
|
137 | export type ActionFromMatcher<M extends Matcher<any>> = M extends Matcher<
|
138 | infer T
|
139 | >
|
140 | ? T
|
141 | : never
|
142 |
|
143 | export type Id<T> = { [K in keyof T]: T[K] } & {}
|