我可以提取映射类型中的可观察类型吗?

时间:2019-08-21 12:59:34

标签: typescript

我有这个界面:

export interface MainEvents {
  successful$: Observable<EventObject>;
  notSuccessful$: Observable<EventObject>;
  ended$: Observable<EventObject>;
}

我想创建一个使用相同键的类型,但应该是Observable<EventObject>而不是BehaviorSubject<EventObject>

我已经定义了我的类型:

 type SubjectsType = {
   [P in keyof MainEvents ]: BehaviorSubject<MainEvents [P]>; 
 }

但是当然它声明为BehaviorSubject<Obserbable<EventObject>>而不是BehaviorSubject<EventObject>

有没有一种方法可以自动提取Type类型,以便最终我可以添加更多具有不同可观察类型的接口成员,还是我需要手动进行操作?

1 个答案:

答案 0 :(得分:3)

您可以结合使用inferconditional types来提取通用类型参数:

type SubjectsType = {
    [P in keyof MainEvents]: BehaviorSubject<MainEvents[P] extends Observable<infer X> ? X : never>;
}

这现在将导致泛型类型参数为值,或者如果值不是开头的never类型,则返回Observable

您也可以在this typescript playground中看到它的作用。

您还可以使SubjectType通用,从而允许重用:

type SubjectsType<T> = {
    [P in keyof T]: BehaviorSubject<T[P] extends Observable<infer X> ? X : never>; 
}

type MainSubjectTypes = SubjectsType<MainEvents>;