如何基于含Observable泛型的接口创建去除Observable的新接口?
如何自动去除接口中Observable类型的包装?
完全可以通过TypeScript的映射类型和条件类型实现你想要的效果,无需手动编写新接口的每个属性。
定义RemoveObservable类型
核心是利用TypeScript的类型推断(infer关键字)提取Observable包装的内部类型,再通过映射类型遍历原接口的所有属性进行转换:
type RemoveObservable<T> = { [K in keyof T]: T[K] extends Observable<infer U> ? U : T[K]; };
工作原理
[K in keyof T]:遍历原接口T的所有属性键T[K] extends Observable<infer U>:判断当前属性值是否是Observable类型,如果是,就用infer U提取出它的泛型参数(也就是被包装的原始类型)- 条件分支:如果是Observable类型则返回提取出的
U,否则保留原属性类型
完整使用示例
// 先声明Observable的基础定义(根据你实际使用的库调整,比如RxJS) interface Observable<T> { subscribe(next: (value: T) => void): void; } // 原接口 interface SomeObject { value1: Observable<string>; value2: boolean; value3: Observable<number>; } // 生成去除Observable包装的类型 type SomeObjectWithoutObservable = RemoveObservable<SomeObject>; // 验证类型正确性(不会出现类型错误) const validObj: SomeObjectWithoutObservable = { value1: "hello", value2: true, value3: 456 };
接口继承的方式实现
如果你偏好使用接口继承的形式,也可以这样写,效果完全一致:
interface SomeObjectWithoutObservable extends RemoveObservable<SomeObject> {}
内容的提问来源于stack exchange,提问作者Jordan9232
相关产品推荐
相关产品推荐

