Angular中类型守卫(Type Guard)无法实现类型收窄(Type Narrowing)的问题求助
Angular中类型守卫(Type Guard)无法实现类型收窄(Type Narrowing)的问题求助
我目前碰到了一个Angular类型收窄的问题,想请大家帮忙出出主意。
先说说我的TypeScript类型定义:
interface A_DTO { type: string, commonProperty: string, uniquePropertyA: string, etc.. } interface B_DTO { type: string, commonProperty: string, uniquePropertyB: string, etc... } type AnyDTO = A_DTO | B_DTO
我的业务流程是这样的:从API拿到对象后,我会通过读取type属性直接把它转成A_DTO或B_DTO类型,之后把这个对象存在服务的一个变量里,这个变量的类型是AnyDTO。后续组件调用这个变量时转回AnyDTO类型,不会丢失任何属性,这部分是正常的。
但问题出在组件模板里,我写了这样的代码:
@if(object.type == "Type_A") { // 这里能访问object.commonProperty // 但访问不了object.uniquePropertyA } @ else if(object.type == "Type_B") { // 这里能访问object.commonProperty // 但访问不了object.uniquePropertyB }
这里的object是AnyDTO类型,也就是A_DTO | B_DTO的联合类型。
我试过在TypeScript类里定义类型守卫函数:
protected isTypeA(object: any): object is A_DTO { return object?.type === "Type_A"; }
然后在模板里调用这个守卫:
@if(isTypeA(object)) { // 还是只能访问object.commonProperty // 依旧访问不了object.uniquePropertyA... } @ else if(object.type == "Type_B") { // 同样访问不了object.uniquePropertyB }
哪怕在@if里调用了类型守卫,object还是被当作A_DTO | B_DTO类型处理,完全没实现类型收窄,只能访问公共属性。
我还试过在模板里强制类型转换,比如(object as A_DTO).uniquePropertyA,但这种写法在Angular模板里根本不生效。
想请教大家有没有动态的解决方案?最好不用在TypeScript类里为每个子类型单独创建变量。
Cheers,
ST
备注:内容来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

