Flow - это средство проверки типов, созданное Facebook для проверки типов данных JavaScript. Он имеет множество встроенных типов данных, которые мы можем использовать для аннотирования типов переменных и параметров функций.
В этой статье мы рассмотрим typeof
типы, которые являются производными от других значений.
Оператор JavaScript Typeof
В JavaScript оператор typeof
в основном полезен для проверки типа примитивных значений. Например, это работает для чисел, логических значений и строк:
typeof 2 === 'number'
typeof true === 'boolean'
typeof 'abc' === 'string'
Для объектов он всегда возвращает 'object'
:
typeof { foo: 'abc' } === 'object'
Тип оператора потока
Оператор Flow typeof
гораздо полезнее. Его можно использовать для возврата значения любого типа.
Например, он может получить тип чисел следующим образом:
let num = 42; let num2: typeof num = 3.14;
Он потерпит неудачу, если мы присвоим ему значения любого другого типа, например следующие:
num2 = 'foo';
Преимущество оператора typeof
в Flow состоит в том, что его также можно использовать для объектов. Например, если у нас есть следующий объект:
let obj = { foo: 1, bar: true };
Затем мы можем использовать оператор typeof
, чтобы назначить объект obj
как тип другого объекта следующим образом:
let obj2: typeof obj = { foo: 1, bar: false };
Пока у нас есть все свойства obj
с одним и тем же типом данных, он удовлетворяет требованиям типа typeof obj
.
Мы можем сделать то же самое для массивов следующим образом:
let foo = [1, 2, 3]; let bar: typeof foo = [3, 2, 1];
typeof foo
сделает вывод, что тип foo
является числовым массивом, поэтому мы можем присвоить другой числовой массив bar
.
Вывод типа
Оператор typeof
неявно выполняет вывод типа. Когда мы используем буквальные значения с Flow, то предполагаемый тип - это примитив, которому принадлежит значение.
Например, 1
будет number
. Мы можем переопределить предполагаемый тип, явно указав тип переменной, которую мы определяем следующим образом:
let num1: 1 = 1;
Тогда присвоение num1
чему-либо другому, кроме 1
, не удастся:
let num2: typeof num1 = 3;
Приведенный выше код выдаст нам ошибку.
Проверка номинального типа Typeof
Как и другие части Flow, оператор typeof
также номинально проверяет тип. Это означает, что он проверяет имя, а не структуру. Таким образом, даже если два типа имеют одинаковую структуру, но если их имена разные, они считаются разными.
Например, если мы напишем:
class Foo { foo(val: number) { } } class Bar { foo(val: number) { } }
Тогда сработает следующее задание:
let x: typeof Foo = Foo;
потому что оба типа имеют одинаковое имя, но:
let y: typeof Foo = Bar;
потерпит неудачу, даже если Foo
и Bar
имеют одинаковую структуру, поскольку имеют разные имена.
С помощью оператора Flow typeof
мы можем идентифицировать типы объектов в дополнение к примитивам. Он соответствует системе номинальных типов Flow в том, что он также проверяет имя по имени, а не по структуре.
Кроме того, оператор typeof
может определять типы на основе данных, присвоенных переменной. Например, если переменная является числовым массивом, то использование оператора typrof
в этом массиве вернет числовой массив в качестве типа.