Menu
CoddyTech

交叉类型

本课属于 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 表:交集只对检查器有意义。

challenge icon

挑战

简单

将两个小形状组合成一个。

  1. 编写 type HasName = {name: string}、type HasAge = {age: number} 和 type Person = HasName & HasAge。
  2. 创建 local user: Person = {name = "Omar", age = 31}。
  3. 打印 `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 在线编译器