如何在TypeScript中定义无限嵌套结构的Interface/Type
适配嵌套结构的TypeScript类型定义
要实现你描述的这种叶子节点为固定格式、非叶子节点可嵌套包含叶子或其他非叶子节点的结构,我们可以用TypeScript的递归类型来完成,完美适配任意层级的嵌套需求。
1. 定义基础类型
首先明确叶子节点的固定格式:
// 叶子节点:固定包含dataType字段 type LeafNode = { dataType: string; };
然后定义递归的节点类型,非叶子节点是一个对象,其属性可以是叶子节点,也可以是另一个嵌套的节点结构:
// 递归类型:节点要么是叶子,要么是包含多个节点的对象 type SchemaNode = LeafNode | { [key: string]: SchemaNode };
2. 定义完整结构类型
针对你给出的示例数据,直接基于SchemaNode定义根结构即可:
// 对应示例中的根结构 type RootSchema = { sample: SchemaNode; };
3. 验证示例数据
把你的示例数据(注意修正collectionDate里的笔误:dateType改为dataType)代入,完全符合我们定义的类型:
const sampleSchema: RootSchema = { "sample": { "tags": { "dataType": "string[]" }, "isRestricted": { "dataType": "boolean" }, "organism": { "sex": { "dataType": "string" }, "collection": { "collectionDate": {"dataType": "date"}, "collectionAddress": { "addressLine": { "dataType": "string" }, "city": { "dataType": "string" }, "postalCode": { "dataType": "string" } } } } } };
补充说明
- 递归类型
SchemaNode会自动处理任意深度的嵌套,不管结构有多少层级,都能正确约束 - 如果需要更严格的类型校验(比如限制
dataType的可选值),可以把string换成联合类型,例如:type DataType = "string" | "boolean" | "date" | "string[]";,再将LeafNode里的dataType改为DataType
内容的提问来源于stack exchange,提问作者Chuanbao Lu
相关产品推荐
相关产品推荐

