import type { Middleware, StoreEnhancer } from 'redux' import type { EnhancerArray, MiddlewareArray } from './utils' /** * return True if T is `any`, otherwise return False * taken from https://github.com/joonhocho/tsdef * * @internal */ export type IsAny = // test if we are going the left AND right path in the condition true | false extends (T extends never ? true : false) ? True : False /** * return True if T is `unknown`, otherwise return False * taken from https://github.com/joonhocho/tsdef * * @internal */ export type IsUnknown = unknown extends T ? IsAny : False export type FallbackIfUnknown = IsUnknown /** * @internal */ export type IfMaybeUndefined = [undefined] extends [P] ? True : False /** * @internal */ export type IfVoid = [void] extends [P] ? True : False /** * @internal */ export type IsEmptyObj = T extends any ? keyof T extends never ? IsUnknown>> : False : never /** * returns True if TS version is above 3.5, False if below. * uses feature detection to detect TS version >= 3.5 * * versions below 3.5 will return `{}` for unresolvable interference * * versions above will return `unknown` * * @internal */ export type AtLeastTS35 = [True, False][IsUnknown< ReturnType<() => T>, 0, 1 >] /** * @internal */ export type IsUnknownOrNonInferrable = AtLeastTS35< IsUnknown, IsEmptyObj> > /** * Convert a Union type `(A|B)` to an intersection type `(A&B)` */ export type UnionToIntersection = ( U extends any ? (k: U) => void : never ) extends (k: infer I) => void ? I : never // Appears to have a convenient side effect of ignoring `never` even if that's not what you specified export type ExcludeFromTuple = T extends [ infer Head, ...infer Tail ] ? ExcludeFromTuple : Acc type ExtractDispatchFromMiddlewareTuple< MiddlewareTuple extends any[], Acc extends {} > = MiddlewareTuple extends [infer Head, ...infer Tail] ? ExtractDispatchFromMiddlewareTuple< Tail, Acc & (Head extends Middleware ? IsAny : {}) > : Acc export type ExtractDispatchExtensions = M extends MiddlewareArray< infer MiddlewareTuple > ? ExtractDispatchFromMiddlewareTuple : M extends ReadonlyArray ? ExtractDispatchFromMiddlewareTuple<[...M], {}> : never type ExtractStoreExtensionsFromEnhancerTuple< EnhancerTuple extends any[], Acc extends {} > = EnhancerTuple extends [infer Head, ...infer Tail] ? ExtractStoreExtensionsFromEnhancerTuple< Tail, Acc & (Head extends StoreEnhancer ? IsAny : {}) > : Acc export type ExtractStoreExtensions = E extends EnhancerArray< infer EnhancerTuple > ? ExtractStoreExtensionsFromEnhancerTuple : E extends ReadonlyArray ? UnionToIntersection< E[number] extends StoreEnhancer ? Ext extends {} ? IsAny : {} : {} > : never type ExtractStateExtensionsFromEnhancerTuple< EnhancerTuple extends any[], Acc extends {} > = EnhancerTuple extends [infer Head, ...infer Tail] ? ExtractStateExtensionsFromEnhancerTuple< Tail, Acc & (Head extends StoreEnhancer ? IsAny : {}) > : Acc export type ExtractStateExtensions = E extends EnhancerArray< infer EnhancerTuple > ? ExtractStateExtensionsFromEnhancerTuple : E extends ReadonlyArray ? UnionToIntersection< E[number] extends StoreEnhancer ? StateExt extends {} ? IsAny : {} : {} > : never /** * Helper type. Passes T out again, but boxes it in a way that it cannot * "widen" the type by accident if it is a generic that should be inferred * from elsewhere. * * @internal */ export type NoInfer = [T][T extends any ? 0 : never] export type Omit = Pick> export interface TypeGuard { (value: any): value is T } export interface HasMatchFunction { match: TypeGuard } export const hasMatchFunction = ( v: Matcher ): v is HasMatchFunction => { return v && typeof (v as HasMatchFunction).match === 'function' } /** @public */ export type Matcher = HasMatchFunction | TypeGuard /** @public */ export type ActionFromMatcher> = M extends Matcher< infer T > ? T : never export type Id = { [K in keyof T]: T[K] } & {}