타입 단언
Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨. 80개 중 74번째.
열거형 단원에서 이미 한 번 ::를 사용해 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 가드와 같은 실제 검사를 우선 사용하세요.
챌린지
쉬움any 형식으로 전달되는 레코드를 읽으세요.
type User = {id: number, username: string, isActive: boolean}을 작성하세요.local function describeUser(data: any): string을 작성하고,local user = data :: User로 형 변환한 뒤`User {user.id}: {user.username} (Active: {user.isActive})`을 반환하세요.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) type User = {...}
-- 2) describeUser(data: any): string, ::를 사용한 타입 캐스팅
-- 3) describeUser(rawUser2)를 출력
Luau 소개의 모든 레슨
4함수 다루기
매개변수와 반환값의 타입 지정익명 함수의 타입 지정아무것도 반환하지 않는 함수선택적 매개변수기본 매개변수 값불리언 기본값가변 인자 함수함수 타입 정의하기복습: 타입이 지정된 함수직접 연습해 보세요: 온라인 Luau 컴파일러