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 в этом массиве вернет числовой массив в качестве типа.