Типы пересечения (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и электронной почтой"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-словариПотренируйтесь самостоятельно: Онлайн-компилятор Lua