首页 > 解决方案 > 将 BehaviourSubject 的输出转换为不同的类型

问题描述

假设我们有:

private userSource = new BehaviorSubject<UserType1 | UserType2>({});

最终返回一个UserType3或者可能是动态的类型,它可以是一个特定的类型,但需要在过程中达成一致。

是否可以将 BehaviourSubject 的返回类型转换为不同的类型?

标签: angulartypescripttypesrxjs

解决方案


首先想到的是使用有区别的联合

主要思想是您将拥有一个类型的联合,并且所有这些类型都将拥有一个共同的单例类型

简而言之,这就是它允许您执行的操作:


interface UserTypeOne {
  type?: 't1';
  name: string;
  age:  number;
}

interface UserTypeTwo {
  type?: 't2'
  address: {
    street: string
  }
  city: string;
}

interface UserTypeThree {
  type?: 't3';
  hobbies: string[];
}

/* ... */

type Users = UserTypeOne | UserTypeTwo | UserTypeThree;

/* ... */

const userSource$ = new BehaviorSubject<Users>(null);

/* ... */

switch (u.type) {
      case "t1": {
        console.log('type1', u.age, u.name)

        return;
      }

      case "t2": {
        console.log('type2', u.city, u.address.street)

        return;
      }

      case "t3": {
        console.log('type3', u.hobbies)

        return;
      }      
    }

这是一个 StackBlitz 演示


推荐阅读