Утверждение типов (Type Assertions)
Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 68 из 73.
Иногда ты знаешь о значении больше, чем знает проверяющий типов Luau: например, значение типа any, которое, как ты знаешь, на самом деле является записью user. Утверждение типа (также называемое cast) позволяет сказать checker: «доверься мне, обрабатывай это значение как этот тип». Оператор cast в Luau — :::
type User = {id: number, username: string}
local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- чекер теперь знает поляCast изменяет только то, во что верит проверяющий типов. При выполнении программы это ничего не делает. Он никогда не преобразует значение: "5" :: any по-прежнему является строкой "5", а не числом 5 (для настоящего преобразования используй tonumber). И он никогда ничего не проверяет: если ты укажешь неправильный тип, сам cast не вызовет ошибку. Твой код просто начнёт работать неправильно позже, когда обратится к полям, которых нет.
Когда использовать: когда значение приходит как any (или широкое объединение типов), и ты действительно знаешь его shape. Когда не использовать: чтобы заглушить ошибку типов, которую ты не понимаешь: обычно ошибка сообщает о настоящей ошибке в программе, а её устранение с помощью 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-словариПотренируйтесь самостоятельно: Онлайн-компилятор Lua