Spec-Zone.ru › Flow

Типы и выражения

В JavaScript существует множество типов значений: числа, строки, логические значения, функции, объекты и другие.

1234 as number;
"hi" as string;
true as boolean;
[1, 2] as Array<number>;
({prop: "value"}) as {prop: string};
(function func(s: string) {}) as string => void;

Эти значения можно использовать по-разному:

1 + 2;
"foo" + "bar";
!true;
[1, 2].push(3);
const obj = {prop: "s"};
let value = obj.prop;
obj.prop = "value";
function func(s: string) {}
func("value");

Все эти выражения создают новый тип, который определяется типами значений и выполняемыми над ними операциями.

let num: number = 1 + 2;
let str: string = "foo" + "bar";

В Flow у каждого значения и выражения есть тип.

Статическое определение типов​

Flow должен уметь определять тип каждого выражения. Но он не может просто выполнить ваш код, чтобы выяснить это: в таком случае на результат повлияли бы любые проблемы в коде. Например, если вы создали бы бесконечный цикл, Flow ждал бы его завершения вечно.

Вместо этого Flow должен определять тип значения, анализируя его без выполнения (статический анализ). Он проходит по всем известным типам и начинает определять результаты всех связанных с ними выражений.

Например, чтобы определить результат следующего выражения, Flow сначала нужно определить типы его значений.

val1 + val2;

Если значения — числа, результатом выражения будет число. Если значения — строки, результатом выражения будет строка. Возможны разные варианты, поэтому Flow должен выяснить, что представляют собой эти значения.

Если Flow не может определить точный тип каждого значения, он должен определить все возможные значения и проверить, что окружающий код продолжит работать с каждым из возможных типов.

Корректность и полнота​

При выполнении кода отдельное выражение будет вычисляться лишь для ограниченного набора значений. Но Flow проверяет все возможные значения. Таким образом, Flow проверяет слишком много вариантов, то есть переаппроксимирует набор допустимого кода.

Проверяя все возможные значения, Flow может обнаружить ошибки, которые на самом деле не возникнут при выполнении кода. Flow делает это ради «корректности».

В системах типов корректность — это способность средства проверки типов обнаруживать каждую ошибку, которая может возникнуть во время выполнения. За это приходится платить: иногда обнаруживаются ошибки, которые в действительности не возникнут.

С другой стороны, полнота — это способность средства проверки типов обнаруживать только ошибки, которые действительно возникнут во время выполнения. За это приходится платить: иногда пропускаются ошибки, которые возникнут во время выполнения.

В идеальном мире каждое средство проверки типов было бы одновременно корректным и полным, обнаруживая каждую ошибку, которая возникнет во время выполнения.

Flow стремится быть максимально корректным и полным. Но поскольку JavaScript не разрабатывался с учётом системы типов, Flow иногда приходится идти на компромисс. В таких случаях Flow обычно отдаёт предпочтение корректности, а не полноте, чтобы гарантировать отсутствие ошибок в коде.

Корректность полезна, пока Flow не выдаёт слишком много предупреждений и не мешает продуктивной работе. Иногда, когда корректность становится слишком большим препятствием, Flow отдаёт предпочтение полноте. Таких случаев в Flow всего несколько.

Другие системы типов могут отдавать предпочтение полноте, сообщая только о реальных ошибках и рискуя пропустить некоторые из них. Модульное и интеграционное тестирование — крайний вариант такого подхода. Часто это приводит к тому, что пропускаются самые сложные для обнаружения ошибки, а их поиск остаётся задачей разработчика.

См. также​

  • Подтипы — как типы соотносятся друг с другом
  • Требование аннотаций — когда Flow может вывести типы, а когда их необходимо указать
  • Уточнения типов — как Flow сужает типы с помощью условных проверок
  • Иерархия типов — наглядный обзор взаимосвязей всех типов

© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/lang/types-and-expressions

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API