我有这个界面:
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类型,以便最终我可以添加更多具有不同可观察类型的接口成员,还是我需要手动进行操作?
答案 0 :(得分:3)
您可以结合使用infer
和conditional 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>;