@tanstack/table-core 8.5.20 → 8.5.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/build/cjs/columnHelper.js.map +1 -1
  2. package/build/cjs/core/cell.js.map +1 -1
  3. package/build/cjs/core/column.js.map +1 -1
  4. package/build/cjs/core/headers.js.map +1 -1
  5. package/build/cjs/core/row.js.map +1 -1
  6. package/build/cjs/core/table.js.map +1 -1
  7. package/build/cjs/features/ColumnSizing.js.map +1 -1
  8. package/build/cjs/features/Expanding.js.map +1 -1
  9. package/build/cjs/features/Filters.js.map +1 -1
  10. package/build/cjs/features/Grouping.js.map +1 -1
  11. package/build/cjs/features/Ordering.js.map +1 -1
  12. package/build/cjs/features/Pagination.js.map +1 -1
  13. package/build/cjs/features/Pinning.js.map +1 -1
  14. package/build/cjs/features/RowSelection.js.map +1 -1
  15. package/build/cjs/features/Sorting.js.map +1 -1
  16. package/build/cjs/features/Visibility.js.map +1 -1
  17. package/build/cjs/utils/getGroupedRowModel.js +1 -1
  18. package/build/cjs/utils/getGroupedRowModel.js.map +1 -1
  19. package/build/cjs/utils.js +4 -0
  20. package/build/cjs/utils.js.map +1 -1
  21. package/build/esm/index.js +5 -1
  22. package/build/esm/index.js.map +1 -1
  23. package/build/stats-html.html +1 -1
  24. package/build/stats-react.json +314 -314
  25. package/build/types/index.d.ts +199 -253
  26. package/build/umd/index.development.js +5 -1
  27. package/build/umd/index.development.js.map +1 -1
  28. package/build/umd/index.production.js +1 -1
  29. package/build/umd/index.production.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/columnHelper.ts +20 -27
  32. package/src/core/cell.ts +3 -3
  33. package/src/core/column.ts +5 -2
  34. package/src/core/headers.ts +5 -5
  35. package/src/core/row.ts +1 -1
  36. package/src/core/table.ts +7 -6
  37. package/src/features/ColumnSizing.ts +8 -8
  38. package/src/features/Expanding.ts +4 -4
  39. package/src/features/Filters.ts +11 -17
  40. package/src/features/Grouping.ts +10 -16
  41. package/src/features/Ordering.ts +5 -5
  42. package/src/features/Pagination.ts +6 -6
  43. package/src/features/Pinning.ts +8 -8
  44. package/src/features/RowSelection.ts +4 -4
  45. package/src/features/Sorting.ts +9 -15
  46. package/src/features/Visibility.ts +7 -7
  47. package/src/types.ts +110 -133
  48. package/src/utils/getGroupedRowModel.ts +1 -1
  49. package/src/utils.ts +46 -59
@@ -20,18 +20,18 @@ import { isFunction, makeStateUpdater } from '../utils'
20
20
 
21
21
  export type SortDirection = 'asc' | 'desc'
22
22
 
23
- export interface ColumnSort {
23
+ export type ColumnSort = {
24
24
  id: string
25
25
  desc: boolean
26
26
  }
27
27
 
28
28
  export type SortingState = ColumnSort[]
29
29
 
30
- export interface SortingTableState {
30
+ export type SortingTableState = {
31
31
  sorting: SortingState
32
32
  }
33
33
 
34
- export interface SortingFn<TData extends RowData> {
34
+ export type SortingFn<TData extends RowData> = {
35
35
  (rowA: Row<TData>, rowB: Row<TData>, columnId: string): number
36
36
  }
37
37
 
@@ -46,7 +46,7 @@ export type SortingFnOption<TData extends RowData> =
46
46
  | BuiltInSortingFn
47
47
  | SortingFn<TData>
48
48
 
49
- export interface SortingColumnDef<TData extends RowData> {
49
+ export type SortingColumnDef<TData extends RowData> = {
50
50
  sortingFn?: SortingFnOption<TData>
51
51
  sortDescFirst?: boolean
52
52
  enableSorting?: boolean
@@ -55,7 +55,7 @@ export interface SortingColumnDef<TData extends RowData> {
55
55
  sortUndefined?: false | -1 | 1
56
56
  }
57
57
 
58
- export interface SortingColumn<TData extends RowData> {
58
+ export type SortingColumn<TData extends RowData> = {
59
59
  getAutoSortingFn: () => SortingFn<TData>
60
60
  getAutoSortDir: () => SortDirection
61
61
  getSortingFn: () => SortingFn<TData>
@@ -70,7 +70,7 @@ export interface SortingColumn<TData extends RowData> {
70
70
  getToggleSortingHandler: () => undefined | ((event: unknown) => void)
71
71
  }
72
72
 
73
- interface SortingOptionsBase {
73
+ export type SortingOptions<TData extends RowData> = {
74
74
  manualSorting?: boolean
75
75
  onSortingChange?: OnChangeFn<SortingState>
76
76
  enableSorting?: boolean
@@ -81,21 +81,15 @@ interface SortingOptionsBase {
81
81
  getSortedRowModel?: (table: Table<any>) => () => RowModel<any>
82
82
  maxMultiSortColCount?: number
83
83
  isMultiSortEvent?: (e: unknown) => boolean
84
- }
85
-
86
- type ResolvedSortingFns = keyof SortingFns extends never
84
+ } & (keyof SortingFns extends never
87
85
  ? {
88
86
  sortingFns?: Record<string, SortingFn<any>>
89
87
  }
90
88
  : {
91
89
  sortingFns: Record<keyof SortingFns, SortingFn<any>>
92
- }
93
-
94
- export interface SortingOptions<TData extends RowData>
95
- extends SortingOptionsBase,
96
- ResolvedSortingFns {}
90
+ })
97
91
 
98
- export interface SortingInstance<TData extends RowData> {
92
+ export type SortingInstance<TData extends RowData> = {
99
93
  setSorting: (updater: Updater<SortingState>) => void
100
94
  resetSorting: (defaultState?: boolean) => void
101
95
  getPreSortedRowModel: () => RowModel<TData>
@@ -12,20 +12,20 @@ import { makeStateUpdater, memo } from '../utils'
12
12
 
13
13
  export type VisibilityState = Record<string, boolean>
14
14
 
15
- export interface VisibilityTableState {
15
+ export type VisibilityTableState = {
16
16
  columnVisibility: VisibilityState
17
17
  }
18
18
 
19
- export interface VisibilityOptions {
19
+ export type VisibilityOptions = {
20
20
  onColumnVisibilityChange?: OnChangeFn<VisibilityState>
21
21
  enableHiding?: boolean
22
22
  }
23
23
 
24
- export interface VisibilityDefaultOptions {
24
+ export type VisibilityDefaultOptions = {
25
25
  onColumnVisibilityChange: OnChangeFn<VisibilityState>
26
26
  }
27
27
 
28
- export interface VisibilityInstance<TData extends RowData> {
28
+ export type VisibilityInstance<TData extends RowData> = {
29
29
  getVisibleFlatColumns: () => Column<TData, unknown>[]
30
30
  getVisibleLeafColumns: () => Column<TData, unknown>[]
31
31
  getLeftVisibleLeafColumns: () => Column<TData, unknown>[]
@@ -39,16 +39,16 @@ export interface VisibilityInstance<TData extends RowData> {
39
39
  getToggleAllColumnsVisibilityHandler: () => (event: unknown) => void
40
40
  }
41
41
 
42
- export interface VisibilityColumnDef {
42
+ export type VisibilityColumnDef = {
43
43
  enableHiding?: boolean
44
44
  }
45
45
 
46
- export interface VisibilityRow<TData extends RowData> {
46
+ export type VisibilityRow<TData extends RowData> = {
47
47
  _getAllVisibleCells: () => Cell<TData, unknown>[]
48
48
  getVisibleCells: () => Cell<TData, unknown>[]
49
49
  }
50
50
 
51
- export interface VisibilityColumn {
51
+ export type VisibilityColumn = {
52
52
  getCanHide: () => boolean
53
53
  getIsVisible: () => boolean
54
54
  toggleVisibility: (value?: boolean) => void
package/src/types.ts CHANGED
@@ -27,6 +27,7 @@ import {
27
27
  HeadersInstance,
28
28
  } from './core/headers'
29
29
  import {
30
+ FilterFn,
30
31
  FiltersColumn,
31
32
  FiltersColumnDef,
32
33
  FiltersInstance,
@@ -42,6 +43,7 @@ import {
42
43
  SortingTableState,
43
44
  } from './features/Sorting'
44
45
  import {
46
+ CustomAggregationFns,
45
47
  GroupingCell,
46
48
  GroupingColumn,
47
49
  GroupingColumnDef,
@@ -77,20 +79,15 @@ import {
77
79
  RowSelectionTableState,
78
80
  } from './features/RowSelection'
79
81
  import { CoreRow } from './core/row'
80
- import { PartialKeys, UnionToIntersection } from './utils'
82
+ import { DeepKeys, PartialKeys, UnionToIntersection } from './utils'
81
83
  import { CellContext, CoreCell } from './core/cell'
82
84
  import { CoreColumn } from './core/column'
83
85
 
84
86
  export interface TableMeta<TData extends RowData> {}
85
-
86
87
  export interface ColumnMeta<TData extends RowData, TValue> {}
87
-
88
88
  export interface FilterMeta {}
89
-
90
89
  export interface FilterFns {}
91
-
92
90
  export interface SortingFns {}
93
-
94
91
  export interface AggregationFns {}
95
92
 
96
93
  export type Updater<T> = T | ((old: T) => T)
@@ -100,79 +97,71 @@ export type RowData = unknown | object | any[]
100
97
 
101
98
  export type AnyRender = (Comp: any, props: any) => any
102
99
 
103
- export interface Table<TData extends RowData>
104
- extends CoreInstance<TData>,
105
- HeadersInstance<TData>,
106
- VisibilityInstance<TData>,
107
- ColumnOrderInstance<TData>,
108
- ColumnPinningInstance<TData>,
109
- FiltersInstance<TData>,
110
- SortingInstance<TData>,
111
- GroupingInstance<TData>,
112
- ColumnSizingInstance,
113
- ExpandedInstance<TData>,
114
- PaginationInstance<TData>,
115
- RowSelectionInstance<TData> {}
116
-
117
- interface FeatureOptions<TData extends RowData>
118
- extends VisibilityOptions,
119
- ColumnOrderOptions,
120
- ColumnPinningOptions,
121
- FiltersOptions<TData>,
122
- SortingOptions<TData>,
123
- GroupingOptions,
124
- ExpandedOptions<TData>,
125
- ColumnSizingOptions,
126
- PaginationOptions,
127
- RowSelectionOptions<TData> {}
100
+ export type Table<TData extends RowData> = CoreInstance<TData> &
101
+ HeadersInstance<TData> &
102
+ VisibilityInstance<TData> &
103
+ ColumnOrderInstance<TData> &
104
+ ColumnPinningInstance<TData> &
105
+ FiltersInstance<TData> &
106
+ SortingInstance<TData> &
107
+ GroupingInstance<TData> &
108
+ ColumnSizingInstance &
109
+ ExpandedInstance<TData> &
110
+ PaginationInstance<TData> &
111
+ RowSelectionInstance<TData>
128
112
 
129
113
  export type TableOptionsResolved<TData extends RowData> = CoreOptions<TData> &
130
- FeatureOptions<TData>
131
-
132
- export interface TableOptions<TData extends RowData>
133
- extends PartialKeys<
134
- TableOptionsResolved<TData>,
135
- 'state' | 'onStateChange' | 'renderFallbackValue'
136
- > {}
137
-
138
- export interface TableState
139
- extends CoreTableState,
140
- VisibilityTableState,
141
- ColumnOrderTableState,
142
- ColumnPinningTableState,
143
- FiltersTableState,
144
- SortingTableState,
145
- ExpandedTableState,
146
- GroupingTableState,
147
- ColumnSizingTableState,
148
- PaginationTableState,
149
- RowSelectionTableState {}
150
-
151
- interface CompleteInitialTableState
152
- extends CoreTableState,
153
- VisibilityTableState,
154
- ColumnOrderTableState,
155
- ColumnPinningTableState,
156
- FiltersTableState,
157
- SortingTableState,
158
- ExpandedTableState,
159
- GroupingTableState,
160
- ColumnSizingTableState,
161
- PaginationInitialTableState,
162
- RowSelectionTableState {}
163
-
164
- export interface InitialTableState extends Partial<CompleteInitialTableState> {}
165
-
166
- export interface Row<TData extends RowData>
167
- extends CoreRow<TData>,
168
- VisibilityRow<TData>,
169
- ColumnPinningRow<TData>,
170
- FiltersRow<TData>,
171
- GroupingRow,
172
- RowSelectionRow,
173
- ExpandedRow {}
174
-
175
- export interface RowModel<TData extends RowData> {
114
+ VisibilityOptions &
115
+ ColumnOrderOptions &
116
+ ColumnPinningOptions &
117
+ FiltersOptions<TData> &
118
+ SortingOptions<TData> &
119
+ GroupingOptions &
120
+ ExpandedOptions<TData> &
121
+ ColumnSizingOptions &
122
+ PaginationOptions &
123
+ RowSelectionOptions<TData>
124
+
125
+ export type TableOptions<TData extends RowData> = PartialKeys<
126
+ TableOptionsResolved<TData>,
127
+ 'state' | 'onStateChange' | 'renderFallbackValue'
128
+ >
129
+
130
+ export type TableState = CoreTableState &
131
+ VisibilityTableState &
132
+ ColumnOrderTableState &
133
+ ColumnPinningTableState &
134
+ FiltersTableState &
135
+ SortingTableState &
136
+ ExpandedTableState &
137
+ GroupingTableState &
138
+ ColumnSizingTableState &
139
+ PaginationTableState &
140
+ RowSelectionTableState
141
+
142
+ export type InitialTableState = Partial<
143
+ CoreTableState &
144
+ VisibilityTableState &
145
+ ColumnOrderTableState &
146
+ ColumnPinningTableState &
147
+ FiltersTableState &
148
+ SortingTableState &
149
+ ExpandedTableState &
150
+ GroupingTableState &
151
+ ColumnSizingTableState &
152
+ PaginationInitialTableState &
153
+ RowSelectionTableState
154
+ >
155
+
156
+ export type Row<TData extends RowData> = CoreRow<TData> &
157
+ VisibilityRow<TData> &
158
+ ColumnPinningRow<TData> &
159
+ FiltersRow<TData> &
160
+ GroupingRow &
161
+ RowSelectionRow &
162
+ ExpandedRow
163
+
164
+ export type RowModel<TData extends RowData> = {
176
165
  rows: Row<TData>[]
177
166
  flatRows: Row<TData>[]
178
167
  rowsById: Record<string, Row<TData>>
@@ -191,12 +180,12 @@ export type StringOrTemplateHeader<TData, TValue> =
191
180
  | string
192
181
  | ColumnDefTemplate<HeaderContext<TData, TValue>>
193
182
 
194
- interface StringHeaderIdentifier {
183
+ type StringHeaderIdentifier = {
195
184
  header: string
196
185
  id?: string
197
186
  }
198
187
 
199
- interface IdIdentifier<TData extends RowData, TValue> {
188
+ type IdIdentifier<TData extends RowData, TValue> = {
200
189
  id: string
201
190
  header?: StringOrTemplateHeader<TData, TValue>
202
191
  }
@@ -207,26 +196,24 @@ type ColumnIdentifiers<TData extends RowData, TValue> =
207
196
 
208
197
  //
209
198
 
210
- interface ColumnDefExtensions<TData extends RowData, TValue = unknown>
211
- extends VisibilityColumnDef,
212
- ColumnPinningColumnDef,
213
- FiltersColumnDef<TData>,
214
- SortingColumnDef<TData>,
215
- GroupingColumnDef<TData, TValue>,
216
- ColumnSizingColumnDef {}
217
-
218
- export interface ColumnDefBase<TData extends RowData, TValue = unknown>
219
- extends ColumnDefExtensions<TData, TValue> {
199
+ export type ColumnDefBase<TData extends RowData, TValue = unknown> = {
220
200
  getUniqueValues?: AccessorFn<TData, unknown[]>
221
201
  footer?: ColumnDefTemplate<HeaderContext<TData, TValue>>
222
202
  cell?: ColumnDefTemplate<CellContext<TData, TValue>>
223
203
  meta?: ColumnMeta<TData, TValue>
224
- }
204
+ } & VisibilityColumnDef &
205
+ ColumnPinningColumnDef &
206
+ FiltersColumnDef<TData> &
207
+ SortingColumnDef<TData> &
208
+ GroupingColumnDef<TData, TValue> &
209
+ ColumnSizingColumnDef
225
210
 
226
211
  //
227
212
 
228
- export interface IdentifiedColumnDef<TData extends RowData, TValue = unknown>
229
- extends ColumnDefBase<TData, TValue> {
213
+ export type IdentifiedColumnDef<
214
+ TData extends RowData,
215
+ TValue = unknown
216
+ > = ColumnDefBase<TData, TValue> & {
230
217
  id?: string
231
218
  header?: StringOrTemplateHeader<TData, TValue>
232
219
  }
@@ -236,37 +223,28 @@ export type DisplayColumnDef<
236
223
  TValue = unknown
237
224
  > = ColumnDefBase<TData, TValue> & ColumnIdentifiers<TData, TValue>
238
225
 
239
- interface GroupColumnDefBase<TData extends RowData, TValue = unknown>
240
- extends ColumnDefBase<TData, TValue> {
241
- columns?: ColumnDef<TData, any>[]
242
- }
243
-
244
226
  export type GroupColumnDef<
245
227
  TData extends RowData,
246
228
  TValue = unknown
247
- > = GroupColumnDefBase<TData, TValue> & ColumnIdentifiers<TData, TValue>
248
-
249
- interface AccessorFnColumnDefBase<TData extends RowData, TValue = unknown>
250
- extends ColumnDefBase<TData, TValue> {
251
- accessorFn: AccessorFn<TData, TValue>
252
- }
229
+ > = ColumnDefBase<TData, TValue> &
230
+ ColumnIdentifiers<TData, TValue> & {
231
+ columns?: ColumnDef<TData, any>[]
232
+ }
253
233
 
254
234
  export type AccessorFnColumnDef<
255
235
  TData extends RowData,
256
236
  TValue = unknown
257
- > = AccessorFnColumnDefBase<TData, TValue> & ColumnIdentifiers<TData, TValue>
237
+ > = ColumnDefBase<TData, TValue> &
238
+ ColumnIdentifiers<TData, TValue> & {
239
+ accessorFn: AccessorFn<TData, TValue>
240
+ }
258
241
 
259
- interface AccessorKeyColumnDefBase<TData extends RowData, TValue = unknown>
260
- extends ColumnDefBase<TData, TValue> {
242
+ export type AccessorKeyColumnDef<TData extends RowData, TValue = unknown> = {
261
243
  id?: string
262
- accessorKey: string | keyof TData
263
- }
264
-
265
- export type AccessorKeyColumnDef<
266
- TData extends RowData,
267
- TValue = unknown
268
- > = AccessorKeyColumnDefBase<TData, TValue> &
269
- Partial<ColumnIdentifiers<TData, TValue>>
244
+ } & Partial<ColumnIdentifiers<TData, TValue>> &
245
+ ColumnDefBase<TData, TValue> & {
246
+ accessorKey: string | keyof TData
247
+ }
270
248
 
271
249
  export type AccessorColumnDef<TData extends RowData, TValue = unknown> =
272
250
  | AccessorKeyColumnDef<TData, TValue>
@@ -286,22 +264,21 @@ export type ColumnDefResolved<
286
264
  accessorKey?: string
287
265
  }
288
266
 
289
- export interface Column<TData extends RowData, TValue = unknown>
290
- extends CoreColumn<TData, TValue>,
291
- ColumnVisibilityColumn,
292
- ColumnPinningColumn,
293
- FiltersColumn<TData>,
294
- SortingColumn<TData>,
295
- GroupingColumn<TData>,
296
- ColumnSizingColumn {}
297
-
298
- export interface Cell<TData extends RowData, TValue>
299
- extends CoreCell<TData, TValue>,
300
- GroupingCell {}
301
-
302
- export interface Header<TData extends RowData, TValue>
303
- extends CoreHeader<TData, TValue>,
304
- ColumnSizingHeader {}
305
-
306
- export interface HeaderGroup<TData extends RowData>
307
- extends CoreHeaderGroup<TData> {}
267
+ export type Column<TData extends RowData, TValue = unknown> = CoreColumn<
268
+ TData,
269
+ TValue
270
+ > &
271
+ ColumnVisibilityColumn &
272
+ ColumnPinningColumn &
273
+ FiltersColumn<TData> &
274
+ SortingColumn<TData> &
275
+ GroupingColumn<TData> &
276
+ ColumnSizingColumn
277
+
278
+ export type Cell<TData extends RowData, TValue> = CoreCell<TData, TValue> &
279
+ GroupingCell
280
+
281
+ export type Header<TData extends RowData, TValue> = CoreHeader<TData, TValue> &
282
+ ColumnSizingHeader
283
+
284
+ export type HeaderGroup<TData extends RowData> = CoreHeaderGroup<TData>
@@ -176,7 +176,7 @@ function groupBy<TData extends RowData>(rows: Row<TData>[], columnId: string) {
176
176
  if (!previous) {
177
177
  map.set(resKey, [row])
178
178
  } else {
179
- map.set(resKey, [...previous, row])
179
+ previous.push(row)
180
180
  }
181
181
  return map
182
182
  }, groupMap)
package/src/utils.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { TableState, Updater } from './types'
2
2
 
3
- export type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<T>
4
- export type RequiredKeys<T, K extends keyof T> = T & { [P in K]-?: T[P] }
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>>
5
6
  export type Overwrite<T, U extends { [TKey in keyof T]?: any }> = Omit<
6
7
  T,
7
8
  keyof U
@@ -17,68 +18,54 @@ export type UnionToIntersection<T> = (
17
18
  export type IsAny<T, Y, N> = 1 extends 0 & T ? Y : N
18
19
  export type IsKnown<T, Y, N> = unknown extends T ? N : Y
19
20
 
20
- type IndexableData = Record<string | number, any>
21
- export type DeepValue<T, TProp> = T extends IndexableData
22
- ? TProp extends `${infer TBranch}.${infer TDeepProp}`
23
- ? DeepValue<T[TBranch], TDeepProp>
24
- : TProp extends keyof T
25
- ? T[TProp]
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
26
33
  : never
27
34
  : never
28
35
 
29
- type Join<K, P> = K extends string | number
30
- ? P extends string | number
31
- ? `${K}${'' extends P ? '' : '.'}${P}`
32
- : never
33
- : never
34
-
35
- type Prev = [
36
- never,
37
- 0,
38
- 1,
39
- 2,
40
- 3,
41
- 4,
42
- 5,
43
- 6,
44
- 7,
45
- 8,
46
- 9,
47
- 10,
48
- 11,
49
- 12,
50
- 13,
51
- 14,
52
- 15,
53
- 16,
54
- 17,
55
- 18,
56
- 19,
57
- 20,
58
- ...0[]
59
- ]
60
-
61
- type ExplicitLeaves =
62
- | Date
63
- | Number
64
- | BigInt
65
- | String
66
- | Set<unknown>
67
- | Map<unknown, unknown>
68
- | WeakSet<object>
69
- | WeakMap<object, unknown>
70
-
71
- export type DeepKeys<T, D extends number = 10> = [D] extends [never]
72
- ? never
73
- : T extends ExplicitLeaves
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> = unknown extends T
47
+ ? keyof T
48
+ : object extends T
49
+ ? string
50
+ : T extends readonly any[] & IsTuple<T>
51
+ ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>>
52
+ : T extends any[]
53
+ ? never & 'Dynamic length array indexing is not supported'
54
+ : T extends Date
74
55
  ? never
75
56
  : T extends object
76
- ? {
77
- [K in keyof T]-?: K extends string | number
78
- ? `${K}` | Join<K, DeepKeys<T[K], Prev[D]>>
79
- : never
80
- }[keyof T]
81
- : ''
57
+ ? (keyof T & string) | DeepKeysPrefix<T, keyof T>
58
+ : never
59
+
60
+ type DeepKeysPrefix<T, TPrefix> = TPrefix extends keyof T & (number | string)
61
+ ? `${TPrefix}.${DeepKeys<T[TPrefix]> & string}`
62
+ : never
63
+
64
+ export type DeepValue<T, TProp> = T extends Record<string | number, any>
65
+ ? TProp extends `${infer TBranch}.${infer TDeepProp}`
66
+ ? DeepValue<T[TBranch], TDeepProp>
67
+ : T[TProp & string]
68
+ : never
82
69
 
83
70
  export type NoInfer<T> = [T][T extends any ? 0 : never]
84
71