Menu
CoddyTech

Asercje typów

Część sekcji Wprowadzenie do Luau ścieżki Lua w Coddy. Lekcja 74 z 80.

Użyłeś już raz :: w rozdziale o wyliczeniach, aby potraktować io.read() jako Direction. W tej lekcji przyjrzymy się temu dokładniej.

Czasami wiesz o wartości więcej niż kontroler typów Luau: na przykład wiesz, że wartość o typie any jest w rzeczywistości rekordem użytkownika. Asercja typu (nazywana też rzutowaniem) pozwala powiedzieć kontrolerowi: „zaufaj mi, potraktuj tę wartość jako ten typ”. Operator rzutowania w Luau to :::

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

local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- moduł sprawdzający zna teraz pola

Rzutowanie zmienia wyłącznie to, co uważa kontroler typów. Nie robi niczego podczas działania programu. Nigdy nie konwertuje wartości: "5" :: any nadal jest ciągiem znaków "5", a nie liczbą 5 (do rzeczywistej konwersji użyj tonumber). Rzutowanie nigdy też nie sprawdza poprawności: jeśli zadeklarujesz niewłaściwy typ, samo rzutowanie nie spowoduje błędu. Twój kod po prostu zacznie działać nieprawidłowo później, gdy odwoła się do nieistniejących pól.

Kiedy używać: gdy wartość ma typ any (lub szeroką unię typów), a ty naprawdę znasz jej strukturę. Kiedy nie używać: aby uciszyć niezrozumiały błąd typu: zwykle informuje on o rzeczywistym błędzie, a rzutowanie jedynie go ukrywa. Jeśli możesz sprawdzić wartość podczas działania programu, wybieraj prawdziwe sprawdzenia (takie jak instrukcje warunkowe z typeof z następnej lekcji).

challenge icon

Wyzwanie

Łatwy

Odczytaj rekord, który dociera jako typowany any.

  1. Zapisz type User = {id: number, username: string, isActive: boolean}.
  2. Zapisz local function describeUser(data: any): string, które rzutuje typ za pomocą local user = data :: User i zwraca `User {user.id}: {user.username} (Active: {user.isActive})`.
  3. Wypisz describeUser(rawUser2).

Naciśnij Uruchom kod: wynik pokazuje User 15: bob_admin (Active: false).

Spróbuj swoich sił

-- Surowe rekordy spoza programu: typ any
local rawUser1: any = {id = 7, username = "nina_dev", isActive = true}
local rawUser2: any = {id = 15, username = "bob_admin", isActive = false}

-- 1) type User = {...}
-- 2) describeUser(data: any): string, rzutowanie za pomocą ::
-- 3) print describeUser(rawUser2)

Wszystkie lekcje w sekcji Wprowadzenie do Luau

Poćwicz samodzielnie: Kompilator Luau online