Skip to content

nullable: true ignored if type: object and a property has nullable: true #533

@Jackman3005

Description

@Jackman3005

What's wrong?

Hello again. I have a situation where I had an object with nullable: true and all was working well, then I needed to add some properties that had nullable: true and for some reason the | null on the main object was removed from the types.

This Schema:

MyDomainObjectSchema:
  required:
    - user
  properties:
    user:
      type: object
      nullable: true
      required:
        - id
        - displayName
        - email
      properties:
        id:
          type: string
        displayName:
          type: string
        email:
          type: string
          nullable: true

Produces the following incorrect type:

export interface MyDomainObjectSchema {
  user: {
    id: string;
    displayName: string;
    email: string | null;
  }; // where is the union with `null`?
}

What works

If there are no properties that are nullable then the parent object is correctly typed as shown below:
This Schema:

MyDomainObjectSchema:
  required:
    - user
  properties:
    user:
      type: object
      nullable: true
      required:
        - id
        - displayName
        - email
      properties:
        id:
          type: string
        displayName:
          type: string
        email:
          type: string
          # removing `nullable: true` here fixes the incorrect behavior
          # nullable: true 

Produces the following correct result:

export interface MyDomainObjectSchema {
  user: {
    id: string;
    displayName: string;
    email: string;
  } | null;
}

What is expected

I expect that nullable: true will always apply to an object schema regardless of the properties and their conditions. I expect the original YAML schema provided would produce the following type:

export interface MyDomainObjectSchema {
  user: {
    id: string;
    displayName: string;
    email: string | null;
  } | null;
}

Thanks for the hard work on this. We're still happy to have it to work with :)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions