当前位置: 首页 > 知识库问答 >
问题:

如何用typescript和ajv使oneOf字段可空

祖麻雀
2023-03-14

我有一个名为<code>platform</code>的字段,它可以是<code>字符串</code>或<code>字符串〔〕

打字接口

export interface IEntityLeaderboardQuery {
    rank: string;
    entity_types: string[] | string;
    country?: string | undefined;
    region?: string | undefined;
    start_date: string;
    end_date: string;
    top?: string | undefined;
    platform?: string[] | string | undefined;
}

json模式

export const EntityLeaderboardQuerySchema: JSONSchemaType<IEntityLeaderboardQuery> = {
    type: "object",
    properties: {
        rank: { type: "string" },
        entity_types: {
            oneOf: [
                {
                    type: "string",
                },
                {
                    type: "array",
                    items: { type: "string" },
                },
            ],
        },
        country: { type: "string", nullable: true },
        region: { type: "string", nullable: true },
        start_date: { type: "string" },
        end_date: { type: "string" },
        top: { type: "string", nullable: true },
        platform: {
            oneOf: [
                {
                    type: "string",
                    nullable: true,
                },
                {
                    type: "array",
                    items: { type: "string" },
                    nullable: true,
                },
            ],
        },
    },
    required: ["rank", "entity_types", "start_date", "end_date"],
    additionalProperties: false,
};

如你所见,我试图在oneOf数组中给两个对象都添加可空字段。然而,类型仍然存在一个问题

[错误] 11:07:49 ⨯ 无法编译 TypeScript: src/api/leaderboard/entity/entity-leaderboard.interface.ts:43:14 - 错误 TS2322: 键入 '{ 类型: “object”; 属性: { rank: { type: “string”; }; entity_types: { oneOf: ({ type: “string”; } |{ type: “array”; items: { type: “string”; }; })[];};国家: { 类型: “字符串”; 可为 null: true; };region: { ...; };start_date: { ...; };end_date: { ...; };顶部: { ...; };平台: { ...; };};必需:(“ra...”)不可分配给类型 'UncheckedJSONSchemaType

43 export const EntityLeaderboardQuerySchema: JSONSchemaType = {

ajv: 8.6.2
typescipt: 4.3.5

https://replit.com/join/ngjynszvjr-kaykhan

共有2个答案

淳于兴朝
2023-03-14

出现问题是因为您将< code>nullable: true赋值给< code>oneOf的项,您必须指定outside,因为该属性使用可选的链接< code >? 平台:string[] | string

platform: {
  nullable: true, //<-- nullable Here
  type: ['string', 'array'], //<-- when using "nullable" you must specify the types
  oneOf: [
    { 
      type: 'string' 
    },
    {
      type: 'array',
      items: { type: 'string' },
    }
  ]
}

如果您将严格模式Ajv 一起使用,您可能会收到警告:

strict mode: use allowUnionTypes to allow union type keyword at "#/properties/platform" (strictTypes)

启用<code>allowUnionTypes</code>应该可以工作:

const ajv = new Ajv({ allowUnionTypes: true })
寿嘉悦
2023-03-14

我也遇到过类似的情况,这对我很有帮助:

oneOf: [
    {
        type: "string",
    },
    {
        type: "array",
        items: { type: "string" },
    },
    {
        type: "object",
        nullable: true,
    },
],

使用<code>{type:‘null}</code>不起作用。

 类似资料:
  • 我有一节这样的课 我希望属性是可选的。如何在Java中实现这一点? 在某些语言中,它非常优雅和简单,我们只需在字段名后附加一个问号。

  • 问题内容: 我有一个带有一个可选字段的对象,找不到合适的注释来对其建模。有什么想法和Jackson一起做的正确方法是什么? 问题答案: 在Jackson中,您无法区分可选字段和非可选字段。只需在您的POJO中声明任何字段即可。如果您的JSON结构中没有字段,那么Jackson将不会调用setter。您可以跟踪在POJO中是否用标志调用了setter。

  • 注:内容翻译自官网参考文档中 Java Generated Code 的 oneof 一节。 给假设有一个类似这样的oneof定义: oneof oneof_name { int32 foo_int = 4; string foo_string = 9; ... } 在 oneof_name 这个 oneof 中的所有字段将为他们的值使用共享的 oneof_name 对象

  • 注:内容翻译自官网文档 Language Guide (proto3) 中的 Oneof 一节 如果你有一个有很多字段的消息, 而同一时间最多只有一个字段会被设值, 你可以通过使用oneof特性来强化这个行为并节约内存. Oneof 字段和常见字段类似, 除了所有字段共用内存, 并且同一时间最多有一个字段可以设值. 设值oneof的任何成员都将自动清除所有其他成员. 可以通过使用特殊的case()

  • 我在SQL服务器数据库中有表用户,有近30列。我还为相应的数据库表创建了一个JPA实体。JPA实体如下所示: 现在我正在尝试创建一个本机查询,它只会从用户表中获取id和name。Repository类看起来像这样。 现在,当它被执行时,它会抛出一个异常,如下所示: 当我将地址列添加到我的查询时,这个异常会消失,但它会出现在另一个字段中。 所以,现在我想修改JPA实体,使这个字段成为可选的。我试过使

  • 我尝试使ajv使用两个JSON-Schema,一个依赖于另一个。下面是我的模式的一个示例(简化): json 错误:没有带有键或引用“http://json-schema.org/draft-04/schema#”的模式 更新:如果我从types.json中删除“$schema…”,我得到的错误是: MissingReferror:无法从id#中解析引用types.json#/definition