Расширение структур
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 41 из 73.
Связанные формы часто имеют общие поля. Каждый Admin также является User; копирование общих полей в оба объявления приведет к их расхождению.
Вы уже встречали оператор пересечения & при объединении псевдонимов — для форм он работает точно так же. A & B означает «содержит всё из A и всё из B»:
type User = {name: string, age: number}
type Admin = User & {level: number}
-- Admin теперь требует: name, age И level
local root: Admin = {name = "Root", age = 35, level = 9}Там, где TypeScript требует отдельное ключевое слово extends для интерфейсов, Luau не нужно ничего нового — пересечения уже справляются с этой задачей. Вы можете объединять несколько частей в цепочку:
type Contact = {email: string}
type Developer = User & Contact & {yearsExperience: number}Не путайте & с |: объединение A | B — это любая из двух форм, тогда как пересечение A & B должно удовлетворять обеим одновременно. И поскольку Admin содержит все поля User, значение типа Admin можно передавать везде, где ожидается User.
Задание
ЛегкоСоздайте следующие псевдонимы типов (type aliases):
Employee—id(number),name(string),department(string)Manager—Employee, расширенный (через&) с помощьюteamSize(number)Contact—email(string)Developer— пересечение (intersection)Employee,Contactи{yearsExperience: number}
Создайте:
teamLeadтипаManager— id101, name"Alice Johnson", department"Engineering", teamSize8devтипаDeveloper— id102, name"Bob Smith", department"Engineering", email"bob@company.com", yearsExperience5
Создайте функцию getManagerSummary, которая принимает Manager и возвращает [name] manages [teamSize] people.
Выведите на экран, каждый с новой строки:
- результат
getManagerSummary(teamLead) [name] has [yearsExperience] years of experienceдляdev- department для
teamLead - email для
dev
Попробуйте сами
-- Напишите код здесь
-- 1) определите Employee, затем Manager / Contact / Developer с &
-- 2) создайте teamLead и dev
-- 3) напишите getManagerSummary
-- 4) выведите четыре запрошенные строки
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в 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-словари