Skip to content

Commit 01859af

Browse files
author
Danila Dergachev
authored
Fix useFacetCallback return type (#19)
There was an issue that return type didn't have NO_VALUE since it was exactly matching the return type of the inner callback, this PR fixes that
1 parent 2663cb4 commit 01859af

File tree

2 files changed

+69
-62
lines changed

2 files changed

+69
-62
lines changed

packages/@react-facet/core/src/hooks/useFacetCallback.spec.tsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useEffect, useRef } from 'react'
2-
import { render, act } from '@react-facet/dom-fiber-testing-library'
2+
import { act, render } from '@react-facet/dom-fiber-testing-library'
33
import { useFacetCallback } from './useFacetCallback'
44
import { useFacetEffect } from './useFacetEffect'
55
import { useFacetMap } from './useFacetMap'
@@ -172,9 +172,29 @@ it('returns NO_VALUE if any facet has NO_VALUE and skip calling the callback', (
172172

173173
act(() => {
174174
const result = handler('event')
175-
// verifies that calling the callback returns NO_VALUE
176175
expect(result).toBe(NO_VALUE)
177176
})
178177

179178
expect(callback).not.toHaveBeenCalledWith()
180179
})
180+
181+
it('has proper return type with NO_VALUE in it', () => {
182+
const facetA = createFacet({ initialValue: 'a' })
183+
184+
const TestComponent = () => {
185+
const handler = useFacetCallback(
186+
(a) => (b: string) => {
187+
return a + b
188+
},
189+
[],
190+
[facetA],
191+
)
192+
193+
if (handler('string') !== NO_VALUE) {
194+
throw new Error('Expected NO_VALUE')
195+
}
196+
return null
197+
}
198+
199+
render(<TestComponent />)
200+
})

packages/@react-facet/core/src/hooks/useFacetCallback.ts

Lines changed: 47 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2,93 +2,80 @@ import { useCallback, useLayoutEffect, useRef } from 'react'
22
import { NoValue } from '..'
33
import { Facet, NO_VALUE, Option } from '../types'
44

5-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
6-
export function useFacetCallback<M, V, C extends (...args: any[]) => M | NoValue>(
7-
callback: (v: V) => C,
5+
export function useFacetCallback<M, V, K extends unknown[]>(
6+
callback: (v: V) => (...args: K) => M,
87
dependencies: unknown[],
98
facet: [Facet<V>],
10-
): C
9+
): (...args: K) => M | NoValue
1110

12-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
13-
export function useFacetCallback<M, V, V1, C extends (...args: any[]) => M | NoValue>(
14-
callback: (v: V, v1: V1) => C,
11+
export function useFacetCallback<M, V, V1, K extends unknown[]>(
12+
callback: (v: V, v1: V1) => (...args: K) => M,
1513
dependencies: unknown[],
1614
facet: [Facet<V>, Facet<V1>],
17-
): C
15+
): (...args: K) => M | NoValue
1816

19-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
20-
export function useFacetCallback<M, V, V1, V2, C extends (...args: any[]) => M | NoValue>(
21-
callback: (v: V, v1: V1, v2: V2) => C,
17+
export function useFacetCallback<M, V, V1, V2, K extends unknown[]>(
18+
callback: (v: V, v1: V1, v2: V2) => (...args: K) => M,
2219
dependencies: unknown[],
2320
facet: [Facet<V>, Facet<V1>, Facet<V2>],
24-
): C
21+
): (...args: K) => M | NoValue
2522

26-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
27-
export function useFacetCallback<M, V, V1, V2, V3, C extends (...args: any[]) => M | NoValue>(
28-
callback: (v: V, v1: V1, v2: V2, v3: V3) => C,
23+
export function useFacetCallback<M, V, V1, V2, V3, K extends unknown[]>(
24+
callback: (v: V, v1: V1, v2: V2, v3: V3) => (...args: K) => M,
2925
dependencies: unknown[],
3026
facet: [Facet<V>, Facet<V1>, Facet<V2>, Facet<V3>],
31-
): C
27+
): (...args: K) => M | NoValue
3228

33-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
34-
export function useFacetCallback<M, V, V1, V2, V3, V4, C extends (...args: any[]) => M | NoValue>(
35-
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4) => C,
29+
export function useFacetCallback<M, V, V1, V2, V3, V4, K extends unknown[]>(
30+
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4) => (...args: K) => M,
3631
dependencies: unknown[],
3732
facet: [Facet<V>, Facet<V1>, Facet<V2>, Facet<V3>, Facet<V4>],
38-
): C
33+
): (...args: K) => M | NoValue
3934

40-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
41-
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, C extends (...args: any[]) => M | NoValue>(
42-
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5) => C,
35+
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, K extends unknown[]>(
36+
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5) => (...args: K) => M,
4337
dependencies: unknown[],
4438
facet: [Facet<V>, Facet<V1>, Facet<V2>, Facet<V3>, Facet<V4>, Facet<V5>],
45-
): C
39+
): (...args: K) => M | NoValue
4640

47-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
48-
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, V6, C extends (...args: any[]) => M | NoValue>(
49-
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5, v6: V6) => C,
41+
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, V6, K extends unknown[]>(
42+
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5, v6: V6) => (...args: K) => M,
5043
dependencies: unknown[],
5144
facet: [Facet<V>, Facet<V1>, Facet<V2>, Facet<V3>, Facet<V4>, Facet<V5>, Facet<V6>],
52-
): C
45+
): (...args: K) => M | NoValue
5346

54-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
55-
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, V6, V7, C extends (...args: any[]) => M | NoValue>(
56-
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5, v6: V6, v7: V7) => C,
47+
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, V6, V7, K extends unknown[]>(
48+
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5, v6: V6, v7: V7) => (...args: K) => M,
5749
dependencies: unknown[],
5850
facet: [Facet<V>, Facet<V1>, Facet<V2>, Facet<V3>, Facet<V4>, Facet<V5>, Facet<V6>, Facet<V7>],
59-
): C
51+
): (...args: K) => M | NoValue
6052

61-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
62-
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, V6, V7, V8, C extends (...args: any[]) => M | NoValue>(
63-
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5, v6: V6, v7: V7, v8: V8) => C,
53+
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, V6, V7, V8, K extends unknown[]>(
54+
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5, v6: V6, v7: V7, v8: V8) => (...args: K) => M,
6455
dependencies: unknown[],
6556
facet: [Facet<V>, Facet<V1>, Facet<V2>, Facet<V3>, Facet<V4>, Facet<V5>, Facet<V6>, Facet<V7>, Facet<V8>],
66-
): C
57+
): (...args: K) => M | NoValue
6758

68-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
69-
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, V6, V7, V8, V9, C extends (...args: any[]) => M | NoValue>(
70-
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5, v6: V6, v7: V7, v8: V8, v9: V9) => C,
59+
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, V6, V7, V8, V9, K extends unknown[]>(
60+
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5, v6: V6, v7: V7, v8: V8, v9: V9) => (...args: K) => M,
7161
dependencies: unknown[],
7262
facet: [Facet<V>, Facet<V1>, Facet<V2>, Facet<V3>, Facet<V4>, Facet<V5>, Facet<V6>, Facet<V7>, Facet<V8>, Facet<V9>],
73-
): C
74-
75-
export function useFacetCallback<
76-
M,
77-
V,
78-
V1,
79-
V2,
80-
V3,
81-
V4,
82-
V5,
83-
V6,
84-
V7,
85-
V8,
86-
V9,
87-
V10,
88-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
89-
C extends (...args: any[]) => M | NoValue,
90-
>(
91-
callback: (v: V, v1: V1, v2: V2, v3: V3, v4: V4, v5: V5, v6: V6, v7: V7, v8: V8, v9: V9, v10: V10) => C,
63+
): (...args: K) => M | NoValue
64+
65+
export function useFacetCallback<M, V, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, K extends unknown[]>(
66+
callback: (
67+
v: V,
68+
v1: V1,
69+
v2: V2,
70+
v3: V3,
71+
v4: V4,
72+
v5: V5,
73+
v6: V6,
74+
v7: V7,
75+
v8: V8,
76+
v9: V9,
77+
v10: V10,
78+
) => (...args: K) => M,
9279
dependencies: unknown[],
9380
facet: [
9481
Facet<V>,
@@ -103,7 +90,7 @@ export function useFacetCallback<
10390
Facet<V9>,
10491
Facet<V10>,
10592
],
106-
): C
93+
): (...args: K) => M | NoValue
10794

10895
/**
10996
* Creates a callback that depends on the value of a facet.
@@ -117,7 +104,7 @@ export function useFacetCallback<
117104
* Having this as the second argument allows the linter to work.
118105
*/
119106
export function useFacetCallback<M>(
120-
callback: (...args: unknown[]) => (...args: unknown[]) => M | NoValue,
107+
callback: (...args: unknown[]) => (...args: unknown[]) => M,
121108
dependencies: unknown[],
122109
facets: Facet<unknown>[],
123110
): (...args: unknown[]) => M | NoValue {

0 commit comments

Comments
 (0)