如何描述输入类型相等并且流中可能的类型数量有限?

问题描述 投票:1回答:1

考虑一个基本的排序函数,该函数应与字符串或数字(或某些将来的东西,如日期)一起使用。

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进行比较。但是,由于我必须在函数调用中选择一种类型,因此应该可以推断出双方都是相同的类型?

javascript flowtype
1个回答
0
投票

<T: number|string>(lval: ?T, rval: ?T)实际上并不意味着lvalrval必须相同。就是说lvalrval必须满足类型T,可以是numberstring

例如,这是一些用例

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)时,就是说lvalrval匹配相同的类型,在您的情况下,这是并集string | number

因此,为了确保您的功能正常,您需要类似以下的尝试流程https://flow.org/try/#0C4TwDgpgBAoglsAFhATlAvFAzsFcB2A5lAD5T4CuAtgEaoDcAUIwGYX4DGwcA9vlDQCGWCAGUeKYKgA8AFQBcsBMhQA+ABQAbAG6DNigPyyANFBS79UIwEpFAWgCMJAAwkHUAN6MoPqHBZQWhYY6Jjmetae3r4xKBDAFCj8zkwxAL7RPv6BOnohmJSamqRkucWhmOwAJhAsBBBVkV4xsfGJ-A6pvhkx2erh5aHkFEUlZsEVUNW19Y1RLb5xCUlQjl0+Pb59oJA8AWX5UADkOHhER1AAZJdQOxB743mTJ7gEhEdNmYttKweqj8UDFB3PZOl9NlkAuo7g8Ds9KLRUBdrrdwPcAgNDkcEXQUB95i0lu0oH8AVZgVBQesoJsiSs1owMowhCJxJJUOoHAAmADMpheZ3e1iYLLEEikKHUAreR35pxlwuZwjF7Ml3L5wN5itFbIlnN5plwFAgisYQA

© www.soinside.com 2019 - 2024. All rights reserved.