Skip to content

Commit 46f8d9a

Browse files
fix: unknown array length derived values should now by typed properly (#224)
* fix: unknown array length derived values should now by typed properly * ci: apply automated fixes and generate docs --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent 8173467 commit 46f8d9a

File tree

5 files changed

+51
-29
lines changed

5 files changed

+51
-29
lines changed

docs/reference/classes/derived.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ title: Derived
77

88
# Class: Derived\<TState, TArr\>
99

10-
Defined in: [derived.ts:54](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L54)
10+
Defined in: [derived.ts:61](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L61)
1111

1212
## Type Parameters
1313

@@ -23,7 +23,7 @@ Defined in: [derived.ts:54](https://github.com/TanStack/store/blob/main/packages
2323
new Derived<TState, TArr>(options): Derived<TState, TArr>
2424
```
2525

26-
Defined in: [derived.ts:87](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L87)
26+
Defined in: [derived.ts:94](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L94)
2727

2828
#### Parameters
2929

@@ -43,7 +43,7 @@ Defined in: [derived.ts:87](https://github.com/TanStack/store/blob/main/packages
4343
lastSeenDepValues: unknown[] = [];
4444
```
4545

46-
Defined in: [derived.ts:71](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L71)
46+
Defined in: [derived.ts:78](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L78)
4747

4848
***
4949

@@ -53,7 +53,7 @@ Defined in: [derived.ts:71](https://github.com/TanStack/store/blob/main/packages
5353
listeners: Set<Listener<TState>>;
5454
```
5555

56-
Defined in: [derived.ts:60](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L60)
56+
Defined in: [derived.ts:67](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L67)
5757

5858
***
5959

@@ -63,7 +63,7 @@ Defined in: [derived.ts:60](https://github.com/TanStack/store/blob/main/packages
6363
options: DerivedOptions<TState, TArr>;
6464
```
6565

66-
Defined in: [derived.ts:63](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L63)
66+
Defined in: [derived.ts:70](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L70)
6767

6868
***
6969

@@ -73,7 +73,7 @@ Defined in: [derived.ts:63](https://github.com/TanStack/store/blob/main/packages
7373
prevState: undefined | TState;
7474
```
7575

76-
Defined in: [derived.ts:62](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L62)
76+
Defined in: [derived.ts:69](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L69)
7777

7878
***
7979

@@ -83,7 +83,7 @@ Defined in: [derived.ts:62](https://github.com/TanStack/store/blob/main/packages
8383
state: TState;
8484
```
8585

86-
Defined in: [derived.ts:61](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L61)
86+
Defined in: [derived.ts:68](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L68)
8787

8888
## Methods
8989

@@ -93,7 +93,7 @@ Defined in: [derived.ts:61](https://github.com/TanStack/store/blob/main/packages
9393
checkIfRecalculationNeededDeeply(): void
9494
```
9595

96-
Defined in: [derived.ts:157](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L157)
96+
Defined in: [derived.ts:164](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L164)
9797

9898
#### Returns
9999

@@ -107,7 +107,7 @@ Defined in: [derived.ts:157](https://github.com/TanStack/store/blob/main/package
107107
getDepVals(): object
108108
```
109109

110-
Defined in: [derived.ts:72](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L72)
110+
Defined in: [derived.ts:79](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L79)
111111

112112
#### Returns
113113

@@ -139,7 +139,7 @@ prevVal: undefined | NonNullable<TState>;
139139
mount(): () => void
140140
```
141141

142-
Defined in: [derived.ts:178](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L178)
142+
Defined in: [derived.ts:185](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L185)
143143

144144
#### Returns
145145

@@ -157,7 +157,7 @@ Defined in: [derived.ts:178](https://github.com/TanStack/store/blob/main/package
157157
recompute(): void
158158
```
159159

160-
Defined in: [derived.ts:145](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L145)
160+
Defined in: [derived.ts:152](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L152)
161161

162162
#### Returns
163163

@@ -171,7 +171,7 @@ Defined in: [derived.ts:145](https://github.com/TanStack/store/blob/main/package
171171
registerOnGraph(deps): void
172172
```
173173

174-
Defined in: [derived.ts:96](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L96)
174+
Defined in: [derived.ts:103](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L103)
175175

176176
#### Parameters
177177

@@ -193,7 +193,7 @@ readonly (
193193
subscribe(listener): () => void
194194
```
195195

196-
Defined in: [derived.ts:190](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L190)
196+
Defined in: [derived.ts:197](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L197)
197197

198198
#### Parameters
199199

@@ -217,7 +217,7 @@ Defined in: [derived.ts:190](https://github.com/TanStack/store/blob/main/package
217217
unregisterFromGraph(deps): void
218218
```
219219

220-
Defined in: [derived.ts:125](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L125)
220+
Defined in: [derived.ts:132](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L132)
221221

222222
#### Parameters
223223

docs/reference/interfaces/derivedfnprops.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ title: DerivedFnProps
77

88
# Interface: DerivedFnProps\<TArr, TUnwrappedArr\>
99

10-
Defined in: [derived.ts:23](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L23)
10+
Defined in: [derived.ts:30](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L30)
1111

1212
## Type Parameters
1313

@@ -25,7 +25,7 @@ Defined in: [derived.ts:23](https://github.com/TanStack/store/blob/main/packages
2525
currDepVals: TUnwrappedArr;
2626
```
2727

28-
Defined in: [derived.ts:35](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L35)
28+
Defined in: [derived.ts:42](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L42)
2929

3030
***
3131

@@ -35,7 +35,7 @@ Defined in: [derived.ts:35](https://github.com/TanStack/store/blob/main/packages
3535
prevDepVals: undefined | TUnwrappedArr;
3636
```
3737

38-
Defined in: [derived.ts:34](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L34)
38+
Defined in: [derived.ts:41](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L41)
3939

4040
***
4141

@@ -45,6 +45,6 @@ Defined in: [derived.ts:34](https://github.com/TanStack/store/blob/main/packages
4545
prevVal: unknown;
4646
```
4747

48-
Defined in: [derived.ts:33](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L33)
48+
Defined in: [derived.ts:40](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L40)
4949

5050
`undefined` if it's the first run

docs/reference/interfaces/derivedoptions.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ title: DerivedOptions
77

88
# Interface: DerivedOptions\<TState, TArr\>
99

10-
Defined in: [derived.ts:38](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L38)
10+
Defined in: [derived.ts:45](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L45)
1111

1212
## Type Parameters
1313

@@ -25,7 +25,7 @@ Defined in: [derived.ts:38](https://github.com/TanStack/store/blob/main/packages
2525
deps: TArr;
2626
```
2727

28-
Defined in: [derived.ts:47](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L47)
28+
Defined in: [derived.ts:54](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L54)
2929

3030
***
3131

@@ -35,7 +35,7 @@ Defined in: [derived.ts:47](https://github.com/TanStack/store/blob/main/packages
3535
fn: (props) => TState;
3636
```
3737

38-
Defined in: [derived.ts:51](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L51)
38+
Defined in: [derived.ts:58](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L58)
3939

4040
Values of the `deps` from before and after the current invocation of `fn`
4141

@@ -57,7 +57,7 @@ Values of the `deps` from before and after the current invocation of `fn`
5757
optional onSubscribe: (listener, derived) => () => void;
5858
```
5959

60-
Defined in: [derived.ts:42](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L42)
60+
Defined in: [derived.ts:49](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L49)
6161

6262
#### Parameters
6363

@@ -85,7 +85,7 @@ Defined in: [derived.ts:42](https://github.com/TanStack/store/blob/main/packages
8585
optional onUpdate: () => void;
8686
```
8787

88-
Defined in: [derived.ts:46](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L46)
88+
Defined in: [derived.ts:53](https://github.com/TanStack/store/blob/main/packages/store/src/derived.ts#L53)
8989

9090
#### Returns
9191

packages/store/src/derived.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,20 @@ export type UnwrapDerivedOrStore<T> =
1111

1212
type UnwrapReadonlyDerivedOrStoreArray<
1313
TArr extends ReadonlyArray<Derived<any> | Store<any>>,
14-
> = TArr extends readonly [infer Head, ...infer Tail]
15-
? Head extends Derived<any> | Store<any>
16-
? Tail extends ReadonlyArray<Derived<any> | Store<any>>
17-
? [UnwrapDerivedOrStore<Head>, ...UnwrapReadonlyDerivedOrStoreArray<Tail>]
14+
> = TArr extends readonly []
15+
? []
16+
: TArr extends readonly [infer Head, ...infer Tail]
17+
? Head extends Derived<any> | Store<any>
18+
? Tail extends ReadonlyArray<Derived<any> | Store<any>>
19+
? [
20+
UnwrapDerivedOrStore<Head>,
21+
...UnwrapReadonlyDerivedOrStoreArray<Tail>,
22+
]
23+
: [UnwrapDerivedOrStore<Head>]
24+
: []
25+
: TArr extends ReadonlyArray<Derived<any> | Store<any>>
26+
? Array<UnwrapDerivedOrStore<TArr[number]>>
1827
: []
19-
: []
20-
: []
2128

2229
// Can't have currVal, as it's being evaluated from the current derived fn
2330
export interface DerivedFnProps<

packages/store/tests/derived.test-d.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,21 @@ test('dep array inner types work', () => {
1212
})
1313
})
1414

15+
test('dep array inner types work with derived vals', () => {
16+
const derived = new Derived({
17+
fn: () => 123,
18+
deps: [],
19+
})
20+
21+
new Derived({
22+
// This is an edgecase that might happen when an array is of unknown length, like being drive through `.map`
23+
deps: [derived] as ReadonlyArray<typeof derived>,
24+
fn: ({ currDepVals }) => {
25+
expectTypeOf(currDepVals).toMatchTypeOf<Array<number>>()
26+
},
27+
})
28+
})
29+
1530
test('return type inferencing should work', () => {
1631
const derived = new Derived({
1732
deps: [],

0 commit comments

Comments
 (0)