Menu
CoddyTech

Утверждения типов

Часть раздела Введение в Luau путешествия по Lua на Coddy. Урок 74 из 80.

Ты уже использовал :: один раз в главе об enum, чтобы рассматривать io.read() как Direction. В этом уроке мы разберём его подробнее.

Иногда ты знаешь о значении больше, чем система проверки типов Luau: например, значение типа any, которое, как ты знаешь, на самом деле является записью пользователя. Утверждение типа (также называемое приведением типа) позволяет сказать системе проверки: «Поверь мне, считай это значение значением этого типа». Оператор приведения типов в Luau — :::

type User = {id: number, username: string}

local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- теперь проверяющий анализатор знает о полях

Приведение меняет только то, во что верит система проверки типов. Во время выполнения оно ничего не делает. Оно никогда не преобразует значение: "5" :: any по-прежнему является строкой "5", а не числом 5 (для настоящего преобразования используй tonumber). И оно никогда ничего не проверяет: если ты укажешь неправильный тип, само приведение не вызовет ошибку. Позже код просто будет работать неправильно, когда обратится к отсутствующим полям.

Когда использовать: когда значение приходит как any (или широкий объединённый тип) и ты действительно знаешь его структуру. Когда не использовать: чтобы заглушить ошибку типа, которую ты не понимаешь: обычно ошибка указывает на настоящую проблему, а приведение просто её скрывает. Если можешь проверить значение во время выполнения, предпочитай настоящие проверки (например, проверки с typeof в следующем уроке).

challenge icon

Задание

Легко

Прочитай запись, которая поступает с типом any.

  1. Напиши type User = {id: number, username: string, isActive: boolean}.
  2. Напиши local function describeUser(data: any): string, которая приводит тип с помощью local user = data :: User и возвращает `User {user.id}: {user.username} (Active: {user.isActive})`.
  3. Выведи describeUser(rawUser2).

Нажми Запустить код: в выводе появится User 15: bob_admin (Active: false).

Попробуйте сами

-- Необработанные записи из внешнего источника: тип any
local rawUser1: any = {id = 7, username = "nina_dev", isActive = true}
local rawUser2: any = {id = 15, username = "bob_admin", isActive = false}

-- 1) тип User = {...}
-- 2) describeUser(data: any): string, приведение типа с помощью ::
-- 3) вывести describeUser(rawUser2)

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

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