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:
- Если вы переносите существующий код на типы Flow и пока не можете проверять код на соответствие типам (например, сначала нужно перенести другой код).
- Если вы уверены, что код работает, но по какой-то причине 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