Khẳng định kiểu
Thuộc phần Giới thiệu về Luau trong hành trình Lua của Coddy. Bài học 74 trên 80.
Bạn đã dùng :: một lần trong chương về enum để coi io.read() là một Direction. Bài học này sẽ giải thích kỹ hơn.
Đôi khi bạn biết nhiều hơn về một giá trị so với trình kiểm tra kiểu của Luau: chẳng hạn, bạn biết một giá trị có kiểu any thực chất là bản ghi người dùng. Ép kiểu (type assertion) (còn gọi là chuyển kiểu (cast)) cho phép bạn bảo trình kiểm tra: “cứ tin mình, hãy coi giá trị này là kiểu này”. Toán tử ép kiểu của Luau là :::
type User = {id: number, username: string}
local raw: any = {id = 42, username = "alice_dev"}
local user = raw :: User
print(user.username) -- Giờ trình kiểm tra đã biết các trường dữ liệuÉp kiểu chỉ thay đổi điều mà trình kiểm tra kiểu tin tưởng. Thao tác này không làm gì khi chạy chương trình. Nó không bao giờ chuyển đổi giá trị: "5" :: any vẫn là chuỗi "5", không phải số 5 (hãy dùng tonumber để chuyển đổi thực sự). Nó cũng không xác thực giá trị: nếu bạn ép sang sai kiểu, bản thân thao tác ép kiểu sẽ không gây lỗi. Code của bạn chỉ hoạt động sai về sau, khi truy cập các thuộc tính không tồn tại.
Khi nào nên dùng: khi một giá trị có kiểu any (hoặc một kiểu hợp rộng) và bạn thực sự biết cấu trúc của nó. Khi nào không nên dùng: để bỏ qua lỗi kiểu mà bạn không hiểu: lỗi thường báo cho bạn biết về một bug thực sự, còn việc ép kiểu chỉ che giấu bug đó. Nếu có thể xác minh khi chạy chương trình, hãy ưu tiên kiểm tra thực sự (như các điều kiện kiểm tra typeof trong bài học tiếp theo).
Thử thách
DễĐọc một bản ghi có kiểu dữ liệu any.
- Viết
type User = {id: number, username: string, isActive: boolean}. - Viết
local function describeUser(data: any): string, ép kiểu bằnglocal user = data :: Uservà trả về`User {user.id}: {user.username} (Active: {user.isActive})`. - In ra
describeUser(rawUser2).
Nhấn Chạy code: đầu ra hiển thị User 15: bob_admin (Active: false).
Tự làm thử
-- Các bản ghi thô từ bên ngoài chương trình: có kiểu 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, ép kiểu bằng ::
-- 3) in ra describeUser(rawUser2)
Tất cả bài học trong Giới thiệu về Luau
1Bắt đầu với Luau
Luau là gì?Tại sao nên dùng Luau?Đoạn code Luau đầu tiênKiểm tra kiểu và chế độ lỗiÔn tập: Giới thiệu về Luau4Làm việc với hàm
Kiểu dữ liệu cho tham số và giá trị trả vềKiểu dữ liệu cho hàm ẩn danhHàm không trả về giá trịTham số tùy chọnGiá trị tham số mặc địnhGiá trị Boolean mặc địnhHàm có số lượng tham số thay đổiĐịnh nghĩa kiểu hàmÔn tập: hàm có kiểu dữ liệu2Kiểu dữ liệu cốt lõi
Số, chuỗi và BooleanKiểu 'any': lối thoátKiểu 'unknown'Kiểu Nil và kiểu tùy chọnSuy luận kiểu trong thực tếChú thích kiểu tường minhÔn tập: luyện tập với kiểu dữ liệu cốt lõi5Bí danh kiểu, kiểu hợp và kiểu giao
Bí danh kiểu cho kiểu nguyên thủyKiểu hợpLàm việc với kiểu hợpKiểu literalKiểu giaoKết hợp bí danh kiểuÔn tập: kết hợp kiểu nâng cao3Bảng có kiểu: mảng và Map
Mảng có kiểuThêm và đọc phần tửKiểu Map là gì?Khai báo và truy cập MapDuyệt bảngBảng có cấu trúc hỗn hợpĐọc lướiTạo lướitable.unpackÔn tập: mảng và MapTự luyện tập: Trình biên dịch Luau online