从联合类型过滤到子类型

时间:2019-02-14 17:02:47

标签: typescript

当我使用.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");

有什么方法可以正确输入吗?

3 个答案:

答案 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[];

playground