考虑以下伪代码:
abstract class X {}
class Y extends X {
static compare(a: Y, b: Y) {
return a.id - b.id;
}
}
class Z extends X {
static compare(a: Z, b: Z) {
return a.name.localCompare(b.name);
}
}
function sort<T extends X>(items: T[]) {
return items.sort(T.compare); // <-- illegal
}
Y.sort([new Y(), new Y()]); // <-- should use Ys compare
Z.sort([new Z(), new Z()]); // <-- should use Zs compare
排序函数应该利用用于调用它的类型的相应比较函数.这不起作用,因为T不能那样使用.如何更改末尾的泛型函数,以便使用Y的静态比较函数?
(在任何人发表 comments 之前,请不要提出解决方案,我如何才能简化整个事情并完全避免这个问题.显然,上面是一个类似于MCVE的例子来说明这个问题,而不是我正在处理的完整代码.)