Closed suiyun39 closed 2 years ago
const state$ = useObservable(() => new BehaviorSubject(''))
state$ 始终被推断为 Observable<string>, 后续使用无法调用诸如: value, getValue() 等属性方法.
state$
Observable<string>
value
getValue()
将 useObservable 的类型声明改为:
useObservable
export function useObservable< TOutput, TReturnType extends Observable<TOutput> = Observable<TOutput> >(init: () => TReturnType): TReturnType;
这样当使用 Observable 的子类型时能得到正确的推断:
Observable
const state$ = useObservable(() => new BehaviorSubject('')) // typeof state$ === BehaviorSubject<string>
同时依旧能保持原有的泛型返回类型:
const state$ = useObservable<string>(() => new Subject()) // typeof state$ === Observable<string>
也可以使用另一种方法保证类型兼容:
type TOutput<T> = T extends Observable<any> ? T : Observable<T> export function useObservable<T>(init: () => TOutput<T>): TOutput<T> const state$ = useObservable(() => new BehaviorSubject('')) // typeof state$ === BehaviorSubject<string> const state$ = useObservable<string>(() => new Subject()) // typeof state$ === Observable<string>
好的,感谢反馈
当前问题
state$
始终被推断为Observable<string>
, 后续使用无法调用诸如:value
,getValue()
等属性方法.提议:
将
useObservable
的类型声明改为:这样当使用
Observable
的子类型时能得到正确的推断:同时依旧能保持原有的泛型返回类型:
补充
也可以使用另一种方法保证类型兼容: