我准备了一个联合类型,如下所示:
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"]