types - 类型检查不适用于 Luau 中的通用字符串键?

标签 types lua roblox typechecking luau

我正在尝试创建一个字典数据结构,其中包含多个可以与任何字符串键关联的 CustomType 对象。

我想我可以使用 {[string]: CustomType} 作为我的字典类型,像这样:

--!strict
type CustomType = {
    a: string,
    b: string
}

local dictionary: {[string]: CustomType} = {
    keyOne = { a = 'hello' }, -- should display type error ('b' field missing)
    keyTwo = { a = 'hello', b = 'world'} -- should be fine
}

但是,在上面的代码片段中,即使 keyOne 中缺少 b 字段,代码编辑器中也没有显示类型错误。然而,如果我在字典类型定义中明确定义键,那么它会按预期工作:

--!strict
type CustomType = {
    a: string,
    b: string
}

local dictionary: {keyOne: CustomType, keyTwo: CustomType} = {
    keyOne = { a = 'hello' }, -- displays type error
    keyTwo = { a = 'hello', b = 'world'} -- is fine
}

这是为什么? 我想对所有通用字符串键执行严格的类型检查,而无需在字典类型定义中明确定义它们。我这样做的方式是否错误?这可能是 ROBLOX 问题(因为我正在 ROBLOX 引擎中实现它)?

如有任何帮助,我们将不胜感激。

关于 Luau 类型检查的来源/信息:https://luau-lang.org/typecheck

最佳答案

不幸的是,在当前的 Luau 中(截至 2022 年 9 月撰写本文时为 0.545),一旦您的类型中有索引器([string]),该类型上的其余键将不会以您期望的方式进行检查。

与显式方法调用相比,使用索引器绝对是一个很好的人体工程学改进,但除了类型系统在这些情况下不能完全提供您想要的安全性之外,它有时可能比显式方法调用方法。

为了更好的人体工程学而覆盖表上的 __index、__newindex 和/或 __call 时,请确保您不会在不知不觉中选择退出类型安全,或增加 Luau 应用程序热路径中的运行时开销。

关于types - 类型检查不适用于 Luau 中的通用字符串键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73558671/

相关文章:

types - 从 Rust 中的数组调用闭包

c# - 比较接口(interface)的 GenericTypeDefinition

vb.net - 从 URI 启动应用程序 - VB.NET

lua - 我如何在 Lua 中使用多个 If?

loops - 如何在特定点循环播放ROBLOX音频?

c - C中堆栈中的多种数据类型

haskell - 使用遍历实现 sequenceA

linux - Pkg-config 路径在正确的目录中查找,但未找到 .pc 文件

c - 静态链接lua库后符号丢失

Lua 中的 OOP - 创建类?