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 polaRzutowanie 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).
Wyzwanie
ŁatwyOdczytaj rekord, który dociera jako typowany any.
- Zapisz
type User = {id: number, username: string, isActive: boolean}. - Zapisz
local function describeUser(data: any): string, które rzutuje typ za pomocąlocal user = data :: Useri zwraca`User {user.id}: {user.username} (Active: {user.isActive})`. - 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
1Pierwsze kroki z Luau
Czym jest Luau?Dlaczego warto używać Luau?Twój pierwszy kod w LuauSprawdzanie typów i tryby błędówPodsumowanie: Wprowadzenie do Luau4Praca z funkcjami
Typowanie parametrów i wartości zwracanychTypowanie funkcji anonimowychFunkcje niezwracające wartościParametry opcjonalneDomyślne wartości parametrówWartości domyślne dla typów BooleanFunkcje wariadyczneDefiniowanie typów funkcjiPodsumowanie: funkcje z typami2Podstawowe typy
Number, String i BooleanTyp 'any': wyjście awaryjneTyp 'unknown'Nil i typy opcjonalneInferencja typów w praktyceJawne adnotacje typówPowtórka: ćwiczenia z podstawowych typów5Aliasy, typy sumy i przekroju
Aliasy typów dla typów prostychTypy sumyPraca z typami sumyTypy literałoweTypy przekrojuŁączenie aliasów typówPodsumowanie: zaawansowane kombinacje typów3Typowane tabele: tablice i mapy
Typowane tabliceDodawanie i odczytywanie elementówCzym jest typ mapy?Deklarowanie i uzyskiwanie dostępu do mapIterowanie po tabelachTabele o mieszanej strukturzeOdczytywanie siatkiTworzenie siatkitable.unpackPodsumowanie: tablice i mapyPoćwicz samodzielnie: Kompilator Luau online