如何强制对象类型配置项的预定义结构?以package.json为例
如何在VS Code扩展配置中强制自定义键的子对象结构?
我想在VS Code扩展的package.json里配置一个对象类型的设置项myextension.mysetting,要求:
- 该对象的键可以是用户自定义的任意字符串(比如示例中的
anyKey) - 每个键对应的子对象只能包含
property1和property2两个属性,用户如果添加其他属性(比如property3),需要提示该属性不合法。
当前的配置示例如下:
{ "contributes": { "configuration": { "properties": { "myextension.mysetting": { "type": "object", "default": { "anyKey": { "property1": "", "property2": "" } } } } } } }
请问这种需求是否可以实现?
可以实现,VS Code的配置系统基于JSON Schema,通过patternProperties和additionalProperties两个关键字就能实现这种严格的结构校验。
修改后的配置示例如下:
{ "contributes": { "configuration": { "properties": { "myextension.mysetting": { "type": "object", "default": { "anyKey": { "property1": "", "property2": "" } }, // 匹配任意字符串作为顶层键 "patternProperties": { "^.*$": { "type": "object", "properties": { "property1": { "type": "string" }, "property2": { "type": "string" } }, // 禁止子对象包含未定义的额外属性 "additionalProperties": false, // 可选:强制子对象必须包含这两个属性 "required": ["property1", "property2"] } }, // 可选:禁止顶层对象出现不符合规则的键(此处正则匹配所有,可根据需求调整) "additionalProperties": false } } } } }
关键说明:
patternProperties:使用正则表达式^.*$匹配用户自定义的任意顶层键,并为每个键对应的子对象定义结构规则。additionalProperties: false:直接禁止子对象出现properties中未定义的属性,用户输入property3这类属性时,VS Code会实时提示该属性不合法。required(可选):如果需要强制子对象必须包含property1和property2,可以添加这个关键字,否则用户可以选择只填写其中一个属性。
内容的提问来源于stack exchange,提问作者vanowm
相关产品推荐
相关产品推荐

