Spec-Zone.ru › Flow

Псевдонимы типов

Псевдонимы типов позволяют дать повторно используемое имя любому типу. Они полностью прозрачны — взаимозаменяемы с типом, на который ссылаются.

type ID = number;
const userId: ID = 42;

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

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

Синтаксис псевдонимов типов​

Псевдонимы типов создаются с помощью ключевого слова type, за которым следуют имя псевдонима, знак равенства = и определение типа.

type Alias = Type;

В псевдониме типа можно использовать любой тип.

type NumberAlias = number;
type ObjectAlias = {
  property: string,
  method(): number,
};
type UnionAlias = 1 | 2 | 3;
type AliasAlias = ObjectAlias;

Обобщённые псевдонимы типов​

У псевдонимов типов также могут быть собственные параметры типа.

type MyObject<A, B, C> = {
  property: A,
  method(val: B): C,
};

Параметры типа псевдонимов являются параметризованными. При использовании псевдонима типа необходимо передать значения для каждого его параметра типа.

type MyObject<A, B, C> = {
  foo: A,
  bar: B,
  baz: C,
};


const val: MyObject<number, boolean, string> = {
  foo: 1,
  bar: true,
  baz: 'three',
};

Рекурсивные псевдонимы типов​

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

type Tree = {
  value: number,
  children: Array<Tree>,
};


const t: Tree = {
  value: 1,
  children: [
    {value: 2, children: []},
    {value: 3, children: [{value: 4, children: []}]},
  ],
};

Взаимная рекурсия между псевдонимами также работает, если каждый цикл прерывается конструктором:

type Doc  = {nodes: Array<Node>};
type Node =
  | {kind: "text",  text: string}
  | {kind: "group", doc: Doc};

Псевдонимы типов стираются при компиляции​

Объявление type не создаёт привязки во время выполнения — оно существует только на этапе компиляции. Нельзя использовать имя псевдонима типа в позиции значения, например в качестве аргумента, в выражении typeof или при проверке instanceof:

type Status = "ok" | "error";


const s: Status = "ok"; // Works!
const v = Status;       // Error

Это отличается от классов и перечислений Flow, которые вводят значение времени выполнения наряду с типом с тем же именем.

См. также​

  • Непрозрачные псевдонимы типов — псевдонимы типов, скрывающие исходный тип за пределами файла, в котором они определены
  • Параметры типа — параметризованные типы, используемые с псевдонимами типов и функциями
  • Интерфейсы — ещё один способ определять повторно используемые типы с помощью структурной проверки (на основе формы) экземпляров классов
  • Константные выражения — as const для создания значений времени выполнения, которые одновременно являются типами

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

Spec-Zone.ru

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