Псевдонимы типов
Псевдонимы типов позволяют дать повторно используемое имя любому типу. Они полностью прозрачны — взаимозаменяемы с типом, на который ссылаются.
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