tsHelpers.d.ts 4.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import type { Middleware, StoreEnhancer } from 'redux';
  2. import type { Tuple } from './utils';
  3. export declare function safeAssign<T extends object>(target: T, ...args: Array<Partial<NoInfer<T>>>): void;
  4. /**
  5. * return True if T is `any`, otherwise return False
  6. * taken from https://github.com/joonhocho/tsdef
  7. *
  8. * @internal
  9. */
  10. export type IsAny<T, True, False = never> = true | false extends (T extends never ? true : false) ? True : False;
  11. export type CastAny<T, CastTo> = IsAny<T, CastTo, T>;
  12. /**
  13. * return True if T is `unknown`, otherwise return False
  14. * taken from https://github.com/joonhocho/tsdef
  15. *
  16. * @internal
  17. */
  18. export type IsUnknown<T, True, False = never> = unknown extends T ? IsAny<T, False, True> : False;
  19. export type FallbackIfUnknown<T, Fallback> = IsUnknown<T, Fallback, T>;
  20. /**
  21. * @internal
  22. */
  23. export type IfMaybeUndefined<P, True, False> = [undefined] extends [P] ? True : False;
  24. /**
  25. * @internal
  26. */
  27. export type IfVoid<P, True, False> = [void] extends [P] ? True : False;
  28. /**
  29. * @internal
  30. */
  31. export type IsEmptyObj<T, True, False = never> = T extends any ? keyof T extends never ? IsUnknown<T, False, IfMaybeUndefined<T, False, IfVoid<T, False, True>>> : False : never;
  32. /**
  33. * returns True if TS version is above 3.5, False if below.
  34. * uses feature detection to detect TS version >= 3.5
  35. * * versions below 3.5 will return `{}` for unresolvable interference
  36. * * versions above will return `unknown`
  37. *
  38. * @internal
  39. */
  40. export type AtLeastTS35<True, False> = [True, False][IsUnknown<ReturnType<(<T>() => T)>, 0, 1>];
  41. /**
  42. * @internal
  43. */
  44. export type IsUnknownOrNonInferrable<T, True, False> = AtLeastTS35<IsUnknown<T, True, False>, IsEmptyObj<T, True, IsUnknown<T, True, False>>>;
  45. /**
  46. * Convert a Union type `(A|B)` to an intersection type `(A&B)`
  47. */
  48. export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
  49. export type ExcludeFromTuple<T, E, Acc extends unknown[] = []> = T extends [
  50. infer Head,
  51. ...infer Tail
  52. ] ? ExcludeFromTuple<Tail, E, [...Acc, ...([Head] extends [E] ? [] : [Head])]> : Acc;
  53. type ExtractDispatchFromMiddlewareTuple<MiddlewareTuple extends readonly any[], Acc extends {}> = MiddlewareTuple extends [infer Head, ...infer Tail] ? ExtractDispatchFromMiddlewareTuple<Tail, Acc & (Head extends Middleware<infer D> ? IsAny<D, {}, D> : {})> : Acc;
  54. export type ExtractDispatchExtensions<M> = M extends Tuple<infer MiddlewareTuple> ? ExtractDispatchFromMiddlewareTuple<MiddlewareTuple, {}> : M extends ReadonlyArray<Middleware> ? ExtractDispatchFromMiddlewareTuple<[...M], {}> : never;
  55. type ExtractStoreExtensionsFromEnhancerTuple<EnhancerTuple extends readonly any[], Acc extends {}> = EnhancerTuple extends [infer Head, ...infer Tail] ? ExtractStoreExtensionsFromEnhancerTuple<Tail, Acc & (Head extends StoreEnhancer<infer Ext> ? IsAny<Ext, {}, Ext> : {})> : Acc;
  56. export type ExtractStoreExtensions<E> = E extends Tuple<infer EnhancerTuple> ? ExtractStoreExtensionsFromEnhancerTuple<EnhancerTuple, {}> : E extends ReadonlyArray<StoreEnhancer> ? UnionToIntersection<E[number] extends StoreEnhancer<infer Ext> ? Ext extends {} ? IsAny<Ext, {}, Ext> : {} : {}> : never;
  57. type ExtractStateExtensionsFromEnhancerTuple<EnhancerTuple extends readonly any[], Acc extends {}> = EnhancerTuple extends [infer Head, ...infer Tail] ? ExtractStateExtensionsFromEnhancerTuple<Tail, Acc & (Head extends StoreEnhancer<any, infer StateExt> ? IsAny<StateExt, {}, StateExt> : {})> : Acc;
  58. export type ExtractStateExtensions<E> = E extends Tuple<infer EnhancerTuple> ? ExtractStateExtensionsFromEnhancerTuple<EnhancerTuple, {}> : E extends ReadonlyArray<StoreEnhancer> ? UnionToIntersection<E[number] extends StoreEnhancer<any, infer StateExt> ? StateExt extends {} ? IsAny<StateExt, {}, StateExt> : {} : {}> : never;
  59. /**
  60. * Helper type. Passes T out again, but boxes it in a way that it cannot
  61. * "widen" the type by accident if it is a generic that should be inferred
  62. * from elsewhere.
  63. *
  64. * @internal
  65. */
  66. export type NoInfer<T> = [T][T extends any ? 0 : never];
  67. export type NonUndefined<T> = T extends undefined ? never : T;
  68. export type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
  69. export type WithRequiredProp<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
  70. export type WithOptionalProp<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
  71. export interface TypeGuard<T> {
  72. (value: any): value is T;
  73. }
  74. export interface HasMatchFunction<T> {
  75. match: TypeGuard<T>;
  76. }
  77. export declare const hasMatchFunction: <T>(v: Matcher<T>) => v is HasMatchFunction<T>;
  78. /** @public */
  79. export type Matcher<T> = HasMatchFunction<T> | TypeGuard<T>;
  80. /** @public */
  81. export type ActionFromMatcher<M extends Matcher<any>> = M extends Matcher<infer T> ? T : never;
  82. export type Id<T> = {
  83. [K in keyof T]: T[K];
  84. } & {};
  85. export type Tail<T extends any[]> = T extends [any, ...infer Tail] ? Tail : never;
  86. export {};