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