Asercje typów
Część sekcji Wprowadzenie do Luau ścieżki Lua w Coddy. Lekcja 68 z 73.
Czasami wiesz o wartości więcej niż checker typów Luau: na przykład wartość typu any, o której wiesz, że tak naprawdę jest rekordem użytkownika. Asercja typu (nazywana też rzutowaniem) pozwala powiedzieć checkerowi: „zaufaj mi, traktuj 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 tylko to, w co wierzy checker typów. Nie robi nic w czasie 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). I nigdy nie przeprowadza walidacji: 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 pól, których nie ma.
Kiedy używać: gdy wartość przychodzi jako any (lub szeroka unia) i naprawdę znasz jej strukturę. Kiedy nie używać: żeby uciszyć błąd typów, którego nie rozumiesz: błąd zwykle wskazuje na rzeczywisty problem, a usunięcie go przez rzutowanie jedynie go ukrywa. Jeśli możesz sprawdzić wartość w czasie działania programu, wybieraj prawdziwe kontrole (takie jak strażniki typeof w następnej lekcji).
Wyzwanie
ŁatwyZasymuluj przetwarzanie rekordów, które przychodzą z zewnętrznego źródła bez informacji o typie.
- Zadeklaruj
type User = {id: number, username: string, isActive: boolean}. - Napisz funkcję
describeUser(data: any): string, która rzutujedatana typUserza pomocą::i zwracaUser [id]: [username] (Active: [isActive]), utworzony za pomocą interpolacji ciągów znaków.
Kod początkowy zawiera już trzy surowe rekordy typowane jako any. Wywołaj describeUser dla każdego z nich i wypisz trzy wyniki w podanej kolejności.
Oczekiwany pierwszy wiersz: User 42: alice_dev (Active: true)
Spróbuj swoich sił
-- Surowe rekordy z zewnętrznego źródła: typu `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}
-- Napisz kod tutaj
-- 1) zadeklaruj typ User
-- 2) describeUser(data: any): string — rzutuj za pomocą :: i utwórz komunikat
-- 3) wypisz opisy wszystkich trzech rekordów
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
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 niczego nie zwracająceParametry opcjonalneDomyślne wartości parametrówFunkcje wariadyczneDefiniowanie typów funkcjiPodsumowanie: funkcje z typami2Typy podstawowe
Typy podstawowe: num, str, boolTyp „any”: furtka awaryjnaTyp „unknown”Typy Nil i opcjonalneInferencja typów w praktyceJawne adnotacje typówPowtórka: ćwiczenie typów podstawowych5Aliasy, 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ów8Enumy po luauowemu
Wzorzec enumów w LuauNumeryczne enumy z tabelamiEnumy tekstowe jako unieUżywanie enumów opartych na unii literałówZamrażanie stałych tabelPodsumowanie: enumy po luauowemu11Zaawansowane zagadnienia
Asercje typówStrażniki typów z typeofTyp neverBezpieczeństwo wartości nil w trybie ścisłymSygnatury indeksowePodsumowanie: precyzyjne dostrajanie typów3Typowane tabele: tablice i mapy
Tablice typowaneDodawanie i odczytywanie elementówCzym jest typ mapy?Deklarowanie map i dostęp do nichIterowanie po tabelachTabele o mieszanej strukturzeWielowymiarowe tablice typowanetable.unpack i varargsPodsumowanie: tablice i mapyPoćwicz samodzielnie: Kompilator Luau online