【发布时间】:2020-10-02 13:22:10
【问题描述】:
我有以下代码:
const arrayFromForm: IFirst[] | ISecond[] | IThird[]; // = ... it's initialized
const arrayDB: IFirst[] | ISecond[] | IThird[]; // = ... it's initialized
const entitiesFromDb = arrayDB.filter(
(entity: IFirst | ISecond | IThird) =>
!(arrayFromForm.map(({ id }) => id))
.includes(entity.id)
);
它给了我 1 个错误:"The map expression is not callable"。
如果我错了,请纠正我,但我认为这是因为它不知道联合中的所有接口中都有一个名为id的属性。
我以前使用过类型保护,但我认为您只能在联合中的两种类型之间创建类型保护,因为您必须返回一个布尔值?
我想用 typescript(用户定义的类型保护、typeof、instanceof 等)解决这个问题,但我不确定这是否可行,不是吗? instanceof 不能为接口创建类型保护,对吧?
这里有什么好的解决方案?
编辑:我刚刚解决了一个接口的问题,该接口具有联合中的接口共有的属性,我只是用新接口更改了联合类型。这不是很好的解决方案,因为我想在类型联合中拥有的不同接口中使用特定的方法/属性。
所以我没有删除这个问题,因为了解是否存在用于类型联合的用户定义类型保护(其中包含超过 2 种类型)之类的东西仍然很有帮助。
【问题讨论】:
-
在下面找到我的解决方案。
标签: angular typescript typeguards