You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:41:30