Типы пересечения (Intersection)
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 34 из 73.
Объединения указывают, что значение принадлежит к одному типу или к другому. Пересечения типов работают наоборот: амперсанд & объединяет структуры таблиц в тип, который содержит все поля каждой части:
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; пересечение существует только для средства проверки.
Задание
ЛегкоСоздайте два псевдонима типов: HasName с полем name: string и HasAge с полем age: number.
Создайте Person как пересечение HasName & HasAge.
Создайте HasEmail с полем email: string и Employee как пересечение всех трех типов: HasName & HasAge & HasEmail.
Объявите:
user: Personс именем"Alice"и возрастом25worker: Employeeс именем"Bob", возрастом30и email"bob@company.com"
Создайте displayPerson(person: Person): string, возвращающую "Name: [name], Age: [age]", и displayEmployee(employee: Employee): string, возвращающую "Name: [name], Age: [age], Email: [email]".
Выведите displayPerson(user) и displayEmployee(worker) на отдельных строках.
Попробуйте сами
-- Напишите код здесь
-- type HasName = { name: string }, HasAge, HasEmail
-- type Person = HasName & HasAge
-- type Employee = HasName & HasAge & HasEmail
-- объявите user и worker, напишите две функции display,
-- выведите displayPerson(user) и displayEmployee(worker)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словари