rfc: 为 useObservable 添加泛型以匹配多种 Observable
suiyun39 opened this issue · 1 comments
suiyun39 commented
当前问题
const state$ = useObservable(() => new BehaviorSubject(''))
state$
始终被推断为 Observable<string>
, 后续使用无法调用诸如: value
, getValue()
等属性方法.
提议:
将 useObservable
的类型声明改为:
export function useObservable<
TOutput,
TReturnType extends Observable<TOutput> = Observable<TOutput>
>(init: () => TReturnType): TReturnType;
这样当使用 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>
crimx commented
好的,感谢反馈