|
| 1 | +import { NoInfer } from './utils.types' |
1 | 2 | import { TableOptionsResolved, TableState, Updater } from './types' |
2 | 3 |
|
3 | | -export type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>> |
4 | | -export type RequiredKeys<T, K extends keyof T> = Omit<T, K> & |
5 | | - Required<Pick<T, K>> |
6 | | -export type Overwrite<T, U extends { [TKey in keyof T]?: any }> = Omit< |
7 | | - T, |
8 | | - keyof U |
9 | | -> & |
10 | | - U |
11 | | - |
12 | | -export type UnionToIntersection<T> = ( |
13 | | - T extends any ? (x: T) => any : never |
14 | | -) extends (x: infer R) => any |
15 | | - ? R |
16 | | - : never |
17 | | - |
18 | | -export type IsAny<T, Y, N> = 1 extends 0 & T ? Y : N |
19 | | -export type IsKnown<T, Y, N> = unknown extends T ? N : Y |
20 | | - |
21 | | -type ComputeRange< |
22 | | - N extends number, |
23 | | - Result extends Array<unknown> = [], |
24 | | -> = Result['length'] extends N |
25 | | - ? Result |
26 | | - : ComputeRange<N, [...Result, Result['length']]> |
27 | | -type Index40 = ComputeRange<40>[number] |
28 | | - |
29 | | -// Is this type a tuple? |
30 | | -type IsTuple<T> = T extends readonly any[] & { length: infer Length } |
31 | | - ? Length extends Index40 |
32 | | - ? T |
33 | | - : never |
34 | | - : never |
35 | | - |
36 | | -// If this type is a tuple, what indices are allowed? |
37 | | -type AllowedIndexes< |
38 | | - Tuple extends ReadonlyArray<any>, |
39 | | - Keys extends number = never, |
40 | | -> = Tuple extends readonly [] |
41 | | - ? Keys |
42 | | - : Tuple extends readonly [infer _, ...infer Tail] |
43 | | - ? AllowedIndexes<Tail, Keys | Tail['length']> |
44 | | - : Keys |
45 | | - |
46 | | -export type DeepKeys<T, TDepth extends any[] = []> = TDepth['length'] extends 5 |
47 | | - ? never |
48 | | - : unknown extends T |
49 | | - ? string |
50 | | - : T extends readonly any[] & IsTuple<T> |
51 | | - ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth> |
52 | | - : T extends any[] |
53 | | - ? DeepKeys<T[number], [...TDepth, any]> |
54 | | - : T extends Date |
55 | | - ? never |
56 | | - : T extends object |
57 | | - ? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth> |
58 | | - : never |
59 | | - |
60 | | -type DeepKeysPrefix< |
61 | | - T, |
62 | | - TPrefix, |
63 | | - TDepth extends any[], |
64 | | -> = TPrefix extends keyof T & (number | string) |
65 | | - ? `${TPrefix}.${DeepKeys<T[TPrefix], [...TDepth, any]> & string}` |
66 | | - : never |
67 | | - |
68 | | -export type DeepValue<T, TProp> = |
69 | | - T extends Record<string | number, any> |
70 | | - ? TProp extends `${infer TBranch}.${infer TDeepProp}` |
71 | | - ? DeepValue<T[TBranch], TDeepProp> |
72 | | - : T[TProp & string] |
73 | | - : never |
74 | | - |
75 | | -export type NoInfer<T> = [T][T extends any ? 0 : never] |
76 | | - |
77 | | -export type Getter<TValue> = <TTValue = TValue>() => NoInfer<TTValue> |
78 | | - |
79 | | -/// |
80 | | - |
81 | 4 | export function functionalUpdate<T>(updater: Updater<T>, input: T): T { |
82 | 5 | return typeof updater === 'function' |
83 | 6 | ? (updater as (input: T) => T)(input) |
|
0 commit comments