Spec-Zone.ru › Flow

Any

any полностью отключает проверку типов. Это небезопасно, и этого следует избегать. Не путайте его с unknown (безопасный тип) или empty (нижний тип).

let x: any = 42;
x.foo.bar; // No error — type checking is disabled

Когда это использовать​

Почти никогда. Для значений произвольного типа предпочитайте unknown — он принимает любое значение, оставаясь типобезопасным, поскольку перед использованием требуется уточнить тип. Оставляйте any для постепенной миграции нетипизированного кода или редких случаев, когда корректный код невозможно выразить в системе типов Flow. Это можно обеспечить с помощью правила линтера unclear-type.

Как any обходит проверку типов​

Например, следующий код не вызовет никаких ошибок:

function add(one: any, two: any): number {
  return one + two;
}


add(1, 2);     // Works.
add("1", "2"); // Works.
add({}, []);   // Works.

Flow не обнаружит даже код, который приведёт к ошибкам во время выполнения:

function getNestedProperty(obj: any) {
  return obj.foo.bar.baz;
}


getNestedProperty({});

Есть лишь несколько случаев, когда можно рассмотреть использование any:

  1. Если вы переносите существующий код на типы Flow и пока не можете проверять код на соответствие типам (например, сначала нужно перенести другой код).
  2. Если вы уверены, что код работает, но по какой-то причине Flow не может корректно проверить его типы. В JavaScript есть несколько (и их становится всё меньше) идиом, типы которых Flow не может проверить статически.

Запретить any можно, включив правило линтера unclear-type.

Чтобы найти код с типом any, используйте команду покрытия.

Не допускайте распространения any​

Если значение имеет тип any, Flow может вывести тип any для результатов всех выполняемых операций.

Например, если получить свойство объекта с типом any, результирующее значение также будет иметь тип any.

function fn(obj: any) {
  let foo = obj.foo; // Results in `any` type
}

Затем это значение можно использовать в другой операции, например сложить его как число, и результат тоже будет иметь тип any.

function fn(obj: any) {
  let foo = obj.foo; // Results in `any` type
  let bar = foo * 2; // Results in `any` type
}

Так можно продолжать, пока any не распространится по всему коду.

function fn(obj: any) {
  let foo = obj.foo;
  let bar = foo * 2;
  return bar; // Results in `any` type
}


let bar = fn({ foo: 2 }); // Results in `any` type
let baz = "baz:" + bar; // Results in `any` type

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

function fn(obj: any) {
  let foo: number = obj.foo;
}

Теперь any не будет распространяться по коду.

См. также​

  • Unknown — безопасный надтип всех типов, требующий уточнения типа перед использованием
  • Empty — нижний тип, подтип всех типов
  • Иерархия типов — взаимосвязь any, unknown и empty в системе типов
  • Покрытие — поиск кода с типом any
  • Справочник по правилам линтера — правило линтера unclear-type для запрета использования any

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

Spec-Zone.ru

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