考虑一个基本的排序函数,该函数应与字符串或数字(或某些将来的东西,如日期)一起使用。
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
进行比较。但是,由于我必须在函数调用中选择一种类型,因此应该可以推断出双方都是相同的类型?
<T: number|string>(lval: ?T, rval: ?T)
实际上并不意味着lval
和rval
必须相同。就是说lval
和rval
必须满足类型T,可以是number
或string
。
例如,这是一些用例
baseSorter('123', 123) // works
baseSorter(123, 123) // works
baseSorter(123, true) // fails because boolean does not satisfy T requirements
将T视为类型(数字)或文字(数字1
)。而且,当您执行(lval: ?T, rval: ?T)
时,就是说lval
和rval
匹配相同的类型,在您的情况下,这是并集string | number
。