Menu
CoddyTech

Типы пересечения (Intersection)

Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 36 из 80.

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

type HasName = { name: string }
type HasAge = { age: number }

type Person = HasName & HasAge

-- У Person обязательно должны быть ОБА поля
local user: Person = {
    name = "Alice",
    age = 25,
}

Пропусти age, и проверяющий выдаст ошибку: пересечение — это «и», а не выбор одного из вариантов. Это позволяет создавать большие формы из небольших повторно используемых частей: определяй отдельные типы для разных задач, а затем объединяй их по мере необходимости:

type HasEmail = { email: string }

type Employee = HasName & HasAge & HasEmail

Важное замечание о Luau: пересекай формы таблиц (и типы функций), а не примитивы. Выражение вроде number & string не имеет смысла, поскольку ни одно значение не может одновременно быть и тем и другим. Когда тебе нужна «эта форма плюс та форма», используй &.

Во время выполнения Person, конечно, является обычной таблицей Lua: пересечение существует только для проверяющего.

challenge icon

Задание

Легко

Объедини две небольшие формы в одну.

  1. Напиши type HasName = {name: string}, type HasAge = {age: number} и type Person = HasName & HasAge.
  2. Создай local user: Person = {name = "Omar", age = 31}.
  3. Выведи `Name: {user.name}, Age: {user.age}`.

Нажми Run Code: в выводе появится Name: Omar, Age: 31.

Попробуйте сами

-- 1) type HasName, type HasAge, type Person = HasName & HasAge
-- 2) local user: Person = {...}
-- 3) выведи строку с именем и возрастом

Все уроки раздела Введение в Luau

Потренируйтесь самостоятельно: Онлайн-компилятор Luau