1
1
import { Observable , BehaviorSubject } from 'rxjs'
2
2
import { useState , useEffect , useMemo } from 'react'
3
3
4
- export type InputFactory < T , U = undefined > = U extends undefined
5
- ? ( state$ : Observable < T > ) => Observable < T >
6
- : ( inputs$ : Observable < U > , state$ : Observable < T > ) => Observable < T >
4
+ export type InputFactory < State , Inputs = undefined > = Inputs extends undefined
5
+ ? ( state$ : Observable < State > ) => Observable < State >
6
+ : ( inputs$ : Observable < RestrictArray < Inputs > > , state$ : Observable < State > ) => Observable < State >
7
7
8
- export function useObservable < T > ( inputFactory : InputFactory < T > ) : T | null
9
- export function useObservable < T > ( inputFactory : InputFactory < T > , initialState : T ) : T
10
- export function useObservable < T , U > ( inputFactory : InputFactory < T , U > , initialState : T , inputs : U ) : T
8
+ export type RestrictArray < T > = T extends any [ ] ? T : [ ]
11
9
12
- export function useObservable < T , U > ( inputFactory : InputFactory < T , U > , initialState ?: T , inputs ?: U ) : T | null {
10
+ export function useObservable < State > ( inputFactory : InputFactory < State > ) : State | null
11
+ export function useObservable < State > ( inputFactory : InputFactory < State > , initialState : State ) : State
12
+ export function useObservable < State , Inputs > (
13
+ inputFactory : InputFactory < State , Inputs > ,
14
+ initialState : State ,
15
+ inputs : RestrictArray < Inputs > ,
16
+ ) : State
17
+
18
+ export function useObservable < State , Inputs extends ReadonlyArray < any > > (
19
+ inputFactory : InputFactory < State , Inputs > ,
20
+ initialState ?: State ,
21
+ inputs ?: RestrictArray < Inputs > ,
22
+ ) : State | null {
13
23
const [ state , setState ] = useState ( typeof initialState !== 'undefined' ? initialState : null )
14
24
15
25
const { state$, inputs$ } = useMemo ( ( ) => {
16
- const stateSubject$ = new BehaviorSubject < T | undefined > ( initialState )
17
- const inputSubject$ = new BehaviorSubject < U | undefined > ( inputs )
26
+ const stateSubject$ = new BehaviorSubject < State | undefined > ( initialState )
27
+ const inputSubject$ = new BehaviorSubject < RestrictArray < Inputs > | undefined > ( inputs )
18
28
19
29
return {
20
30
state$ : stateSubject$ ,
@@ -24,18 +34,20 @@ export function useObservable<T, U>(inputFactory: InputFactory<T, U>, initialSta
24
34
25
35
useMemo ( ( ) => {
26
36
inputs$ . next ( inputs )
27
- } , ( ( inputs as unknown ) as ReadonlyArray < any > ) || [ ] )
37
+ } , inputs || [ ] )
28
38
29
39
useEffect (
30
40
( ) => {
31
- let output$ : BehaviorSubject < T >
41
+ let output$ : BehaviorSubject < State >
32
42
if ( inputs ) {
33
43
output$ = ( inputFactory as (
34
- inputs$ : Observable < U | undefined > ,
35
- state$ : Observable < T | undefined > ,
36
- ) => Observable < T > ) ( inputs$ , state$ ) as BehaviorSubject < T >
44
+ inputs$ : Observable < RestrictArray < Inputs > | undefined > ,
45
+ state$ : Observable < State | undefined > ,
46
+ ) => Observable < State > ) ( inputs$ , state$ ) as BehaviorSubject < State >
37
47
} else {
38
- output$ = ( inputFactory as ( state$ : Observable < T | undefined > ) => Observable < T > ) ( state$ ) as BehaviorSubject < T >
48
+ output$ = ( inputFactory as ( state$ : Observable < State | undefined > ) => Observable < State > ) (
49
+ state$ ,
50
+ ) as BehaviorSubject < State >
39
51
}
40
52
const subscription = output$ . subscribe ( ( value ) => {
41
53
state$ . next ( value )
0 commit comments