typescript - 使用多个接口声明 BehaviorSubject 时如何访问所有属性?
问题描述
我有几个接口如下:
export interface INT1 {
prop1: string;
prop2: string;
}
export interface INT2 {
prop1: string;
prop3: string;
}
export interface INT3 {
prop1: string;
prop4: string;
}
现在我试图声明一个BehaviorSubject
返回上述三个接口之一的 a:
private _mySub$ = new BehaviorSubject<INT1 | INT2 | INT3>(undefined);
这不起作用,因为如果我访问该BehaviorSubject
值,我只会找到共享属性(在这种情况下只有prop1
)。我究竟做错了什么?
解决方案
代码没有问题。由于_mySub$
可能是,或BehaviorSubject
类型的 a ,静态分析只能保证在所有情况下都具有属性。在不缩小类型的情况下推断其他属性的存在是不正确的。INT1
INT2
INT3
_mySub$
prop1
如果您知道对于特定上下文,BehaviorSubject
总是会返回恰好其中一个接口,那么您可以使用更具体的声明,例如:
private _mySub$ = new BehaviorSubject<INT1>({prop1: '1', prop2: '2'});
类型警卫
处理广泛类型定义的一个常见解决方案是使用TypeScript Type Guards。
示例:INT1 的用户定义类型保护
function instanceOfINT1(object: any): object is INT1 {
return 'prop2' in object;
}
使用类型保护,您可以prop2
在BehaviorSubject
发出时安全地访问INT1
:
class MyClass {
private _mySub$ = new BehaviorSubject<INT1 | INT2 | INT3>({prop1: '1', prop2: '2'});
constructor() {
this._mySub$.subscribe( (val) => {
if (instanceOfINT1(val)) {
console.log(`val.prop2: ${val.prop2}`);
}
});
}
}
推荐阅读
- javascript - 使用节点 js 按名称过滤
- python - 对函数内的变量使用多个值
- azure - 使用 request.getCookies() 或 request.getSession() 时在 k8s 集群上运行的 Web 应用程序给出 null
- outlook - 无法在 Outlook Web 应用程序中重复出现
- outlook - Outlook 忽略 ics 文件 VEVENT 中的自定义字段
- javascript - Add new Object's name
- eclipse - 使用 eclipse 和 bitbucket 进行 Spring Boot 项目的 Circle CI 集成
- r - 如何在 dplyr 中使用 match 根据外部向量对列进行排序?
- javascript - 如何使用 vue.js 和 html 创建登录页面?
- wso2 - WSO2 IS MFA 与 WSO2 APIM 本地/共享范围 + RBAC 集成