当我使用.filter从数组联合类型A和B过滤到其子类型A之一的数组时,出现以下错误:类型'A'无法分配给类型'B'。
type A = {type: "a"};
type B = {type: "b"};
type AB = A | B;
let ab: AB[] = [{type: "a"}, {type: "b"}];
let res: A[] = ab.filter(item => item.type === "a");
有什么方法可以正确输入吗?
答案 0 :(得分:2)
您可以将类型断言用作其他答案,也可以使用自定义类型防护,因为filter
支持它们
type A = {type: "a"};
type B = {type: "b"};
type AB = A | B;
let ab: AB[] = [{type: "a"}, {type: "b"}];
let res: A[] = ab.filter((item): item is A => item.type === "a");
答案 1 :(得分:1)
filter
键入将返回与源数组相同的类型。我相信唯一可以解决此问题的方法是添加类型断言:
ab.filter(item => item.type === "a") as A[]
// ^^^^^^
答案 2 :(得分:0)
您必须像这样映射数组:let numbers = ab.filter(item => item.type === "a") as A[];