Typescript-基于Union类型的另一个属性的条件属性出现错误



我准备了一个联合类型,如下所示:

export type UnionType =
| {
id: 1;
obj: {
a: string;
b: string;
};
}
| {
id: 2;
obj: {
a: string;
};
};

不幸的是,当我想访问b属性时,它在我的选择器中中断了,比如:xxx.b.

export const selectB = createSelector(
[selectObj],
(someArr: UnionType[]) =>
(someArr.find(ob => ob.id === 1)
?.obj?.b) || '',
);

错误为:

类型"{a:string;}"上不存在属性"b"。

我们能以某种方式解决它吗?

问题(至少基于错误(是,如果您有一个受歧视的并集,您必须执行检查,以确定您是哪种情况。您可以使用一系列if语句,也可以使用判别字段上的switch


declare let o: UnionType;
o.obj.b // error
switch(o.id) {
case 1: o.obj.b; break // ok here
case 2: o.obj.b; break // not ok on this branch
default: assertNever(o); // Optional, ensure no casses are missed, o shoudl be never
}
function assertNever(o: never) {
throw new Error("Not supported")
}

游乐场链接

我最终做了这个:

obj["b"] 

最新更新