我有一个object
类型的变量
let ref_schema_data: object
ref_schema_data
的值
{ '$schema': 'http://json-schema.org/draft-07/schema',
'$id': 'tc_io_schema_top.json',
allOf:
[ { type: 'object', required: [Array], properties: [Object] } ] }
这就是我为ref_schema_data
赋值的方式
function load_schema(filename: string, filepath: string):object {
let json_data = fs.readFileSync(path.join(filepath, filename),'utf8')
return JSON.parse(json_data)
}
我发现很难通过键从对象中获得任何值。例如,我需要获得ref_schema_data["$id"]
。但这不起作用。
我犯的错误是什么。
object
类型很少有用。它没有定义对象的任何属性,因此不允许访问任何属性。相反,定义一个与对象形状匹配的类型。例如:
interface Thingy {
type: string;
required: something[]; // I don't know from the question what you have in this array
properties: something[]; // Or this one
}
interface SchemaData {
$schema: "http://json-schema.org/draft-07/schema", // A string literal type
$id: string;
allOf: Thingy[]; // An array type
}
然后,如果将SchemaData
指定为ref_schema_data
的类型,则可以访问对象中的属性。(显然,您必须填写上面的something
占位符。(
手册中有更多内容。
在你的评论中说:
唯一的问题是我的模式属性不是恒定的,它会变化。所以我觉得很难有相同的接口。我的要求基本上是读取JSON对象,并在存在的情况下获取一些密钥的值
在这种情况下,您的接口使用索引签名(允许任何属性名称(,可能允许值为任何值(any
(:
interface SchemaData {
[key: string]: any;
}
上面写着";SchemaData
是一个以任何字符串作为属性名称的对象,其中所有属性都具有任何类型"它实际上不提供任何类型的安全性,因为在处理你不知道形状的数据时,你不能。:-(
TypeScript游乐场上的实时示例
或者您可以只在ref_schema_data
上使用any
。
TypeScript游乐场上的实时示例