Рассмотрим базовую c функцию сортировки, которая должна работать со строками или числами (или некоторыми будущими вещами, такими как даты).
function baseSorter<T>(lval: ?T, rval: ?T): -1|0|1 {
if (lval === rval) {
return 0;
}
if (lval === null || lval === undefined) {
return 1;
}
if (rval === null || rval === undefined) {
return -1;
}
return lval > rval ? 1 : -1;
}
Flow будет жаловаться на это, что T нельзя сравнивать с T. логично, поскольку T
может быть чем-то сложным, не имеющим возможности сравнения. Поэтому я попытался уменьшить тип:
function baseSorter<T: number|string>(lval: ?T, rval: ?T)
Однако теперь ошибки потока на этом number
нельзя сравнивать с string
. Однако, поскольку мне нужно выбрать один тип при вызове функции, он должен иметь возможность сделать вывод, что обе стороны имеют одинаковый тип?