Menu
Coddy logo textTech

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Lua