Menu
Coddy logo textTech

타입 단언 (Type Assertions)

Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨. 73개 중 68번째.

때로는 Luau의 type checker보다 어떤 값에 대해 더 많은 것을 알고 있을 수 있습니다. 예를 들어 any로 typed되었지만 실제로는 user 레코드라는 것을 알고 있는 경우입니다. type assertion(cast라고도 함)을 사용하면 checker에게 "나를 믿고, 이 값을 이 type으로 취급해"라고 말할 수 있습니다. Luau의 cast 연산자는 ::입니다:

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

local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- 체커가 이제 필드를 알고 있습니다

cast는 type checker가 믿는 내용 변경합니다. 런타임에서는 아무 작업도 하지 않습니다. 값 자체를 변환하지도 않습니다. "5" :: any는 여전히 숫자 5가 아니라 문자열 "5"입니다(실제로 변환하려면 tonumber를 사용하세요). 또한 유효성을 검사하지도 않습니다. 잘못된 type을 assertion하더라도 cast 자체에서는 오류가 발생하지 않습니다. 존재하지 않는 fields에 접근할 때 코드가 나중에 단순히 잘못 동작하게 됩니다.

사용할 때: 값이 any(또는 넓은 union)로 들어오지만 그 shape을 정말로 알고 있을 때입니다. 사용하지 말아야 할 때: 이해하지 못하는 type 오류를 없애기 위해 사용할 때입니다. 오류는 대개 실제 버그를 알려 주는 것이며, cast로 오류를 없애면 버그를 숨길 뿐입니다. 런타임에 확인할 수 있다면, 다음 lesson의 typeof guard와 같은 실제 검사를 우선하세요.

challenge icon

챌린지

쉬움

형식 정보 없이 external source에서 도착하는 records 처리를 시뮬레이션하세요.

  • type User = {id: number, username: string, isActive: boolean}을 declare하세요.
  • data: any::를 사용하여 User로 cast하고 문자열 보간으로 만든 User [id]: [username] (Active: [isActive])를 반환하는 function describeUser(data: any): string을 Write하세요.

starter code에는 이미 any로 typed된 three개의 raw records가 정의되어 있습니다. 각각에 대해 describeUser를 호출하고, 세 결과를 순서대로 print하세요.

예상되는 첫 번째 줄: User 42: alice_dev (Active: true)

직접 해보기

-- 외부 소스의 원시 레코드: `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}

-- 여기에 코드를 작성하세요
-- 1) User 타입을 선언하세요
-- 2) describeUser(data: any): string — ::로 캐스트하고 메시지를 작성하세요
-- 3) 세 레코드 모두의 설명을 출력하세요
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Luau 소개의 모든 레슨

직접 연습해 보세요: 온라인 Lua 컴파일러