为什么 glTF 架构会这样定义枚举?

Why does the glTF schema define enums like this?

如果我在 glTF 2.0 架构中搜索 "enum",我会看到许多枚举定义,例如:

        "type": {
            "description": "Specifies if the camera uses a perspective or orthographic projection.",
            "gltf_detailedDescription": "Specifies if the camera uses a perspective or orthographic projection.  Based on this, either the camera's `perspective` or `orthographic` property will be defined.",
            "anyOf": [
                {
                    "enum": [ "perspective" ]
                },
                {
                    "enum": [ "orthographic" ]
                },
                {
                    "type": "string"
                }
            ]
        },

(来自camera schema

我对此有几个问题:

  1. 我不明白为什么这里是anyOf而不是oneOf?我的理解是相机类型是透视或正交,我对 json 模式的理解是 ).

  2. 我不明白 "type":"string" 字段?对我来说,好像任何字符串值都是有效的?这似乎与glTF的相机定义不一致?

有多个这样的枚举实例。也可以看看: here here

在此先感谢您提供的任何清晰信息。

当时(2017 年)我们使用的是 JSON 架构草案 v4,对枚举的支持没有达到我们需要的水平。以前有一个简单的枚举列表,但我要求在架构中有 per-enum 描述。这可以更好地记录模式中的各个枚举值,并允许格式化软件显示单个枚举值的描述​​。我在这里提出了一个问题:

https://github.com/KhronosGroup/glTF/issues/891

在那个问题的后续,oneOf 发现了一个问题,导致它与 TypeScript 不兼容,因此决定改用 anyOf。尽管有此更改,您仍然只能选择可用枚举之一。

后来,在实施此更改的合并请求中,其中一位规范编辑 explained 认为末尾的额外 "type" : "string" 允许将来 forwards-compatibility。基本上这意味着允许(并鼓励)glTF 2.0 扩展定义核心 glTF 2.0 模式中不存在的新枚举值,并且它们可以在不违反模式的情况下这样做。但是,他们不能任意添加新字段,因为模式对此很严格。新字段必须放入适当名称的 extensionextras 对象中。但是新枚举可以直接出现在现有枚举所在的同一字段中。

最终,我们得到了一个模式,该模式对于人类来说可能看起来有点麻烦,但在处理 JSON 模式的各种验证软件中运行良好。人们可以只查看 Properties Reference README 而不是原始模式文件,这更容易让人眼前一亮。