如何从 TypeScript 接口生成 MongoDB 的 JSON Schema?

4
我的目标是通过使用JSON模式验证来改善我们MongoDB数据库中的数据质量。我们的项目中使用typescript,并且为所有集合都有接口。
因此,我基本上正在寻找一种有效的方式来:
将此接口转换为;
import { ObjectId } from 'mongodb';

export interface Category {
  _id: ObjectId;
  date: Date;
  level: string | null;
}

转换为这个 JSON Schema

export const CategoryJSONSchema = {
  required: ['_id', 'date', 'level'],
  additionalProperties: false,
  properties: {
    _id: { bsonType: 'objectId' },
    date: { bsonType: 'date' },
    level: { oneOf: [{ bsonType: 'null' }, { bsonType: 'string' }] }
  }
}

脚本还是运行时? - Newbie
脚本就可以了 - 不需要运行时 :) - DauleDK
@MikaelHellman 我希望完全支持可选属性、对象和数组——我们广泛使用它们。然而,如果某个实现能够生成90%的接口,那么我很乐意手动编写剩下的10% ☺️ - DauleDK
1
这个可能会有用:typescript-json-schema。但是需要注释并可能需要额外的工作来注释类型(默认情况下它生成类似于'schema : 'date'的类型)。 - Eldar
我赞同@Eldar的观点,typescript-json-schema是正确的选择。我还会检查https://github.com/vega/ts-json-schema-generator。这是一个类似的工具,但使用自己的AST,可能更灵活,可以进行自定义解析和格式化以处理bson类型。 - Alex Blex
显示剩余8条评论
2个回答

1
你需要一个定制的ts-transformer来生成json schema。
这里有一个ts-transformer-keys的例子。
import { keys } from 'ts-transformer-keys';

interface Props {
  id: string;
  name: string;
  age: number;
}
const keysOfProps = keys<Props>();

console.log(keysOfProps); // ['id', 'name', 'age']

我会分叉该软件包,微调以公开字段类型。有了类型信息,生成JSON或模型将变得容易。类似于Prisma.io的操作方式。
还有ts-transformer-enumerate

-2

你考虑过使用mongoose吗?你可以强制你的模式符合一个接口。例如:

const CategorySchema = new mongoose.Schema<CategoryInterface>({ ... });

3
我考虑过 mongoose,但它不属于这个问题的解决方案空间。 - DauleDK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接