Luau --!strict: 返回带有类型注解的表时,遇到未知类型 'DataServiceServer'
我在Roblox上使用Luau开发,并启用了 --!strict。
这是一个ModuleScript,旨在返回一个带类型的表。
它同时在客户端和服务器端运行。
引发问题的最简代码如下:
--!strict
local RunService = game:GetService("RunService")
if RunService:IsClient() then
return {} :: DataServiceServer
end
我得到这个编译错误:
Unknown type 'DataServiceServer'
我的目标是在客户端运行时返回一个被类型标注为 DataServiceServer 的空表。
为什么Luau在严格模式下不能识别这里的类型,以及定义或强制转换这个返回值的正确方法是什么?
解决方案
你遇到的错误是因为类型必须在被引用之前声明。在下面的示例中,"DataServiceServer" 作为一个类型存在。
ModuleScript
--!strict
local RunService = game:GetService("RunService")
export type Data = {
a: boolean,
b: string,
c: number,
d: {[string]: string}
}
if RunService:IsClient() then
return {} :: Data
end
local DataServiceServer: Data = {
a = false,
b = "Test",
c = 5,
d = {["Test"] = "Test2"}
}
return DataServiceServer
在上面的示例中,Data 被声明为一个类型,DataServiceServer 会与之进行比较。如果值不匹配(比如把数字放在应为布尔值的位置),Studio会抛出一个可视化的静态类型错误。尽管如此,这也不是运行时错误,因此你的游戏不会因此“崩溃”。
只有服务器会返回值,而客户端只会接收到一个空表。我只能推测你这样做是为了让客户端无法访问数据,而数据只有服务器才能访问。
另一种更简短、也更快的方法,是直接使用typeof从表本身获取类型:
--!strict
local RunService = game:GetService("RunService")
local DataServiceServer = {
a = false,
b = "Test",
c = 5,
d = {["Test"] = "Test2"}
}
export type DataServiceServer = typeof(DataServiceServer)
if RunService:IsClient() then
return {} :: DataServiceServer
end
return DataServiceServer
这样你就不需要手动引用类型定义,基本上它会为你完成。关于类型有很多可探索的空间,希望对你有一点帮助。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。