Как описать, что типы входов равны и имеют ограниченный набор возможных типов в потоке? - PullRequest
1 голос
/ 27 мая 2020

Рассмотрим базовую 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. Однако, поскольку мне нужно выбрать один тип при вызове функции, он должен иметь возможность сделать вывод, что обе стороны имеют одинаковый тип?

1 Ответ

0 голосов
/ 06 июня 2020

<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.

Итак, чтобы ваша функция звучала вам нужно что-то вроде этого примерки потока https://flow.org/try/#0C4TwDgpgBAoglsAFhATlAvFAzsFcB2A5lAD5T4CuAtgEaoDcAUIwGYX4DGwcA9vlDQCGWCAGUeKYKgA8AFQBcsBMhQA + ABQAbAG6DNigPyyANFBS79UIwEpFAWgCMJAAwkHUAN6MoPqHBZQWhYY6Jjmetae3r4xKBDAFCj8zkwxAL7RPv6BOnohmJSamqRkucWhmOwAJhAsBBBVkV4xsfGJ-A6pvhkx2erh5aHkFEUlZsEVUNW19Y1RLb5xCUlQjl0 + Pb59oJA8AWX5UADkOHhER1AAZJdQOxB743mTJ7gEhEdNmYttKweqj8UDFB3PZOl9NlkAuo7g8Ds9KLRUBdrrdwPcAgNDkcEXQUB95i0lu0oH8AVZgVBQesoJsiSs1owMowhCJxJJUOoHAAmADMpheZ3e1iYLLEEikKHUAreR35pxlwuZwjF7Ml3L5wN5itFbIlnN5plwFAgisYQA

...