交叉类型
本课属于 Coddy Lua 学习旅程的“Luau 入门”单元。第 36 课,共 80 课。
联合类型表示一个值是某种类型或另一种类型。交集类型则相反:符号 & 会将多个表形状组合成一种类型,其中包含每个部分的所有字段:
type HasName = { name: string }
type HasAge = { age: number }
type Person = HasName & HasAge
-- Person 必须同时包含这两个字段
local user: Person = {
name = "Alice",
age = 25,
}如果省略 age,检查器就会报错:交集表示“并且”,绝不是二选一。这样你就能用小而可复用的部分构建更大的形状:为不同的关注点定义专用类型,再根据需要将它们组合起来:
type HasEmail = { email: string }
type Employee = HasName & HasAge & HasEmail
关于 Luau,有一点很重要:交集适用于表形状(以及函数类型),不适用于基本类型。像 number & string 这样的类型毫无意义,因为没有任何值能同时属于这两种类型。当你想要“这种形状加上那种形状”时,& 就是你要用的工具。
当然,在运行时,Person 只是一个普通的 Lua 表:交集只对检查器有意义。
挑战
简单将两个小形状组合成一个。
- 编写
type HasName = {name: string}、type HasAge = {age: number}和type Person = HasName & HasAge。 - 创建
local user: Person = {name = "Omar", age = 31}。 - 打印
`Name: {user.name}, Age: {user.age}`。
按下运行代码:输出会显示 Name: Omar, Age: 31。
亲手试试
-- 1) type HasName, type HasAge, type Person = HasName & HasAge
-- 2) local user: Person = {...}
-- 3) 用 print 输出姓名和年龄这一行
Luau 入门中的所有课
自己练习: Luau 在线编译器