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;
})
为什么参数a
和b
被推断any
?
原因是您有一个数组的并集,这会导致您观察到的问题。
让我们通过命名类型使代码更清晰一些。以后讨论它们时,它会容易得多:
type A = { version: number, a: string };
type B = { version: number, b: string };
因此,您所拥有的list: (A[] | B[])
与相对(A | B)[]
。两者具有不同的语义-后者确实意味着您可以在单个数组中混合使用A
和B
类型,而您只允许一个数组包含一个。但是,在键入方面有所不同。
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] 删除。
我来说两句