Menu
Coddy logo textTech

Утверждение типов (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 в следующем уроке), когда вы можете проверить во время выполнения.

challenge icon

Задание

Легко

Смоделируйте обработку записей, поступающих из внешнего источника без информации о типах.

  • Объявите 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) выведите описание всех трёх записей
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Введение в Luau