使用泛型函数
本课属于 Coddy Lua 学习旅程的“Luau 入门”单元。第 63 课,共 80 课。
你从不告诉 identity T 是什么类型:类型检查器会自行推断。这就是类型推断:在每个调用位置,Luau 都会查看参数,并推导出 T:
local word = identity("Luau") -- T 被推断为字符串类型
local count = identity(12) -- T 被推断为数字类型
local flag = identity(false) -- T 被推断为布尔类型每次调用都是独立的:一行中的 T 可以是字符串,下一行中则可以是数字。推断出的结果和手动编写的类型注解一样安全:对类型检查器来说,word 是一个 string,支持完整的自动补全和错误检查。
与 TypeScript 有一个重要区别:TS 允许你在调用位置通过 identity<number>(5) 强制指定类型。Luau 不支持调用位置的类型参数。这行代码不是特殊语法,所以 Luau 会把尖括号当作小于和大于比较符,导致代码运行失败。如果你想明确指定类型,可以改为给变量添加类型注解:
local count: number = identity(12)你可以用一个熟悉的工具观察类型推断的过程:typeof 会返回某个值在运行时的类型名称,因此 print(typeof(identity(12))) 会输出 number:这个值经过泛型函数后完全没有改变。
挑战
简单让类型检查器在每次调用时推断 T。
- 在函数下方,将
identity("Oslo")存入local city,将identity(42)存入local floors,不要添加类型注解。 - 先打印
typeof(city),再打印typeof(floors)。
按下运行代码:输出会显示 string 和 number。
亲手试试
-- 上一课的泛型恒等函数
local function identity<T>(value: T): T
return value
end
-- 1)通过调用 identity 得到 city 和 floors,不加类型标注
-- 2)打印各自的 typeof 结果
Luau 入门中的所有课
自己练习: Luau 在线编译器