Утверждение типов (Type Assertions)
Часть раздела Введение в Luau путешествия по Lua на Coddy — урок 68 из 73.
Иногда вы знаете о значении больше, чем checker типов Luau — например, значение typed как any, которое, как вы know, really является записью user. Утверждение type (также называемое cast) позволяет вам сказать checker: «trust me, относись к этому значению как к этому type». Оператор cast в Luau — это :::
type User = {id: number, username: string}
local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- чекер теперь знает поляcast изменяет только то, во что верит type checker — он ничего не делает во время выполнения. Он никогда не преобразует значение: "5" :: any — это still string "5", а не number 5 (используйте tonumber для настоящего преобразования). И он никогда не выполняет валидацию: если вы утвердите wrong type, сам cast не вызовет ошибку — ваш код просто поведет себя неправильно later, когда обратится к fields, которых там нет.
Когда использовать: когда значение приходит как any (или широкое объединение) и вы действительно знаете его shape. Когда не использовать: чтобы заглушить ошибку type, которую вы не понимаете — ошибка обычно сообщает вам о реальном баге, и скрывать ее с помощью cast — значит просто прятать ее. Отдавайте предпочтение реальным проверкам (таким как проверки с typeof в следующем уроке), когда вы можете проверить во время выполнения.
Задание
ЛегкоСмоделируйте обработку записей, поступающих из внешнего источника без информации о типах.
- Объявите
type User = {id: number, username: string, isActive: boolean}. - Напишите функцию
describeUser(data: any): string, которая приведётdataкUserс помощью::и вернётUser [id]: [username] (Active: [isActive]), сформированную с помощью интерполяции строк.
Начальный код уже определяет три исходные записи с типом any. Вызовите describeUser для каждой из них и выведите три результата по порядку.
Ожидаемая первая строка: User 42: alice_dev (Active: true)
Попробуйте сами
-- Сырые записи из внешнего источника: типизированы как `any`
local rawUser1: any = {id = 42, username = "alice_dev", isActive = true}
local rawUser2: any = {id = 15, username = "bob_admin", isActive = false}
local rawUser3: any = {id = 99, username = "charlie_user", isActive = true}
-- Напишите код здесь
-- 1) объявите тип User
-- 2) describeUser(data: any): string — приведите с помощью :: и сформируйте сообщение
-- 3) выведите описание всех трёх записей
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Введение в Luau
1Начало работы с Luau
Что такое Luau?Почему именно Luau?Ваш первый код на LuauПроверка типов и режимы ошибокИтоги: Введение в Luau4Работа с функциями
Типизация параметров и возвращаемых значенийТипизация анонимных функцийФункции, ничего не возвращающиеНеобязательные параметрыЗначения параметров по умолчаниюФункции с переменным числом аргументовОпределение типов функцийИтоги: типизированные функции2Базовые типы
Основные типы: num, str, boolТип 'any': лазейка в типизацииТип 'unknown'Nil и опциональные типыВывод типов на практикеЯвные аннотации типовИтоги: практика по базовым типам5Псевдонимы, объединения и пересечения
Псевдонимы типов для примитивовТипы объединения (Union)Работа с типами объединенияЛитеральные типыТипы пересечения (Intersection)Комбинирование псевдонимов типовИтоги: Сложные комбинации типов8Перечисления в стиле Luau
Паттерн перечислений (Enum) в LuauЧисловые перечисления с помощью таблицСтроковые перечисления как объединенияИспользование перечислений на основе литеральных объединенийЗамораживание константных таблицИтоги: Перечисления в стиле Luau11Продвинутые темы
Утверждение типов (Type Assertions)Сужение типов с помощью typeof (Type Guards)Тип neverБезопасность Nil в строгом режимеИндексные сигнатурыИтоги: точная настройка типов3Типизированные таблицы: Массивы и Map-словари
Типизированные массивыДобавление и чтение элементовЧто такое тип Map?Объявление и доступ к Map-словарямИтерация по таблицамТаблицы смешанной формыМногомерные типизированные массивыtable.unpack и VarargsИтоги: Массивы и Map-словари