Типы потока, приведение к типу массива не работает с явного типа, но работает с неявным типом - PullRequest
0 голосов
/ 15 февраля 2019

С учетом следующих строк

const a: Array<number> = [1,2,3];
const b = [1,2,3];
const q: Array<boolean | number> = a;
const r: Array<boolean | number> = b;

Приведенный выше код работает для строк 2 и 4 (b и r), однако поток прерывается на строке 3 с ошибкой:

Невозможно присвоить a для q, поскольку число [1] несовместимо с логическим [2] в элементе массива.

Это не имеет большого смысла для меня, особенно с учетом строкиниже работает.Почему это не работает, и как я могу заставить его работать?


Что касается приложения выше: в моем реальном рабочем коде у меня есть функция, которая принимает любой «простой объект javascript» (объектбез функций).Который я описал следующим образом:
type primitive = boolean | number | string | void;

type plain_js_object = {
  [string]: (primitive | Array<primitive> | plain_js_object)
}
function theFunction(input: plain_js_object) {
    //do_things
    return JSON.stringify(input);
}

А потом у меня есть другая функция, которая возвращает массив целых чисел, функция затем вызывается следующим образом:

const fib = [1, 1, 2, 3, 5];
theFunction({sequence: fib});

Очевидно, {sequence: fib} являетсятипа {sequence: Array<number>}, который, очевидно, является подтипом простых объектов javascript.

1 Ответ

0 голосов
/ 15 февраля 2019

Я думаю, что некоторую полезную информацию можно найти о $ReadOnlyArray.Проблема (я думаю) в том, что Array является инвариантом, то есть Array<number> не является подтипом Array<number | boolean>.Это прекрасно работает:

const a: Array<number> = [1,2,3];
const b = [1,2,3];
const q: $ReadOnlyArray<boolean | number> = a;
const r: Array<boolean | number> = b;

Лучше всего предположить, что Flow делает что-то умное, когда тип выводится из литерала массива, а не явно печатается.

Что касается вашего примера, я не получил никаких ошибок потока при работе 0,93, вы можете показать репродукцию в ссылке Flow Try или что-то в этом роде?

...