如何用TypeScript Awaited<T>工具类型推断Observable的值类型?
解决Observable的类型推断问题(类似Promise的Awaited)
你的泛型写法逻辑本身没问题,但报错大概率是两个原因:
- 未正确导入Observable类型:TypeScript无法识别
Observable类型,导致条件判断失效 - TypeScript版本过低:TS 4.1以下不支持递归条件类型,而你的写法依赖递归推断嵌套的Observable
正确实现步骤:
- 确保已导入rxjs的Observable类型:
import { Observable } from 'rxjs';
- 使用兼容TS 4.1+的递归条件类型:
type AwaitedObservable<T> = T extends Observable<infer R> ? AwaitedObservable<R> : T;
测试验证:
// 单层Observable type SingleObservable = AwaitedObservable<Observable<number>>; // 类型为number // 嵌套Observable type NestedObservable = AwaitedObservable<Observable<Observable<string>>>; // 类型为string // 非Observable类型 type NonObservable = AwaitedObservable<boolean>; // 类型为boolean
额外优化:处理Promise嵌套Observable的场景
如果代码中存在Observable<Promise<T>>这类混合场景,可以扩展类型同时处理Promise:
type AwaitedObservable<T> = T extends Observable<infer R> ? AwaitedObservable<R> : T extends Promise<infer P> ? AwaitedObservable<P> : T;
这样就能同时处理Observable<Promise<number>>这类情况,最终推断出number类型。
内容的提问来源于stack exchange,提问作者nadendla tharak
相关产品推荐
相关产品推荐

