TypeScript使用联合类型元素对数组进行排序

武器
const list: ({ version: number, a: string }[]) | ({ version: number, b: string }[]) = [];

// Parameter 'a' implicitly has an 'any' type.(7006)
list.sort((a, b) => { 
    return a.version - b.version;
})

为什么参数ab被推断any

试试看

VLAZ

原因是您有一个数组的这会导致您观察到的问题。

让我们通过命名类型使代码更清晰一些。以后讨论它们时,它会容易得多:

type A = { version: number, a: string };
type B = { version: number, b: string };

因此,您所拥有的list: (A[] | B[])与相对(A | B)[]两者具有不同的语义-后者确实意味着您可以在单个数组中混合使用AB类型,而您只允许一个数组包含一个。但是,在键入方面有所不同。

TypeScript确实认识到您拥有的并集的所有成员都是数组,因此list.sort()是现有方法。实际上,这是两种方法-一种来自,A[]另一种来自B[]但是,为了确保类型安全,TypeScript将合并两个.sort()方法的签名

签名希望将这些回调传递进来:

type sortA = (x: A, y: A) => number;
type sortB = (x: B, y: B) => number;

因此,为了合并两者,TypeScript将使用

type mergedSort = sortA & sortB

这就带来了问题-实现的函数mergedSort必须接受A或,B但不能同时接受唯一可以做到这一点的函数将接受any类型,因为它满足限制。

因此,为什么要得到推断的类型any-这是唯一可以与任一数组一起使用的类型。

相比之下,如果有,(A | B)[]则该.sort()方法的回调将如下所示:

type sortMixed = (x: A | B, y: A | B): number;

由于联合中的类型共享一个version属性,因此使用它是有效的:

type A = { version: number, a: string };
type B = { version: number, b: string };

const list: (A | B)[] = [];

list.sort((a, b) => {
    return a.version - b.version;
});

游乐场链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章