bcherny/json-schema-to-typescript

indirect depended types generate unwanted type aliases

Closed this issue · 2 comments

Indirect dependency types will generate a type alias for each property, even for primitive types like strings and numbers. This will result in many unwanted type aliases in the final TypeScript code.

In the following JSON schema, we have three classes: Game, Ship, and Gun. Game and Ship are direct dependencies for the Master class, while Gun is an indirect dependency for _Master. In the generated TypeScript, Ship and Game appear as expected, but Gun produces two unnecessary type aliases.

JSON:

{
  "$defs": {
    "Game": {
      "additionalProperties": false,
      "properties": {
        "ships": {
          "items": {
            "$ref": "#/$defs/Ship"
          },
          "type": "array"
        }
      },
      "required": [
        "ships"
      ],
      "title": "Game",
      "type": "object"
    },
    "Gun": {
      "properties": {
        "name": {
          "title": "Name",
          "type": "string"
        },
        "damage": {
          "title": "Damage",
          "type": "number"
        }
      },
      "required": [
        "name",
        "damage"
      ],
      "title": "Gun",
      "type": "object"
    },
    "Ship": {
      "additionalProperties": false,
      "properties": {
        "name": {
          "type": "string"
        },
        "speed": {
          "type": "number"
        },
        "gun": {
          "$ref": "#/$defs/Gun"
        }
      },
      "required": [
        "name",
        "speed",
        "gun"
      ],
      "title": "Ship",
      "type": "object"
    }
  },
  "properties": {
    "Game": {
      "$ref": "#/$defs/Game"
    },
    "Ship": {
      "$ref": "#/$defs/Ship"
    }
  },
  "required": [
    "Game",
    "Ship"
  ],
  "title": "_Master_",
  "type": "object"
}

Typescript:

export type Name = string;
export type Damage = number;

export interface Game {
  ships: Ship[];
}

export interface Ship {
  name: string;
  speed: number;
  gun: Gun;
}

export interface Gun {
  name: Name;
  damage: Damage;
}

I guess it's the same issue as #193, isn't it ?

To make sure I understand, the "two unnecessary type aliases" are?:

export type Name = string;
export type Damage = number;

If so, just remove the title keys from the name and damage properties: https://borischerny.com/json-schema-to-typescript-browser/#schema=%7B%0A%20%20%22$defs%22:%20%7B%0A%20%20%20%20%22Game%22:%20%7B%0A%20%20%20%20%20%20%22additionalProperties%22:%20false,%0A%20%20%20%20%20%20%22properties%22:%20%7B%0A%20%20%20%20%20%20%20%20%22ships%22:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%22items%22:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22$ref%22:%20%22#/$defs/Ship%22%0A%20%20%20%20%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%20%20%20%20%22type%22:%20%22array%22%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%22required%22:%20%5B%0A%20%20%20%20%20%20%20%20%22ships%22%0A%20%20%20%20%20%20%5D,%0A%20%20%20%20%20%20%22title%22:%20%22Game%22,%0A%20%20%20%20%20%20%22type%22:%20%22object%22%0A%20%20%20%20%7D,%0A%20%20%20%20%22Gun%22:%20%7B%0A%20%20%20%20%20%20%22properties%22:%20%7B%0A%20%20%20%20%20%20%20%20%22name%22:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%22type%22:%20%22string%22%0A%20%20%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%20%20%22damage%22:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%22type%22:%20%22number%22%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%22required%22:%20%5B%0A%20%20%20%20%20%20%20%20%22name%22,%0A%20%20%20%20%20%20%20%20%22damage%22%0A%20%20%20%20%20%20%5D,%0A%20%20%20%20%20%20%22title%22:%20%22Gun%22,%0A%20%20%20%20%20%20%22type%22:%20%22object%22%0A%20%20%20%20%7D,%0A%20%20%20%20%22Ship%22:%20%7B%0A%20%20%20%20%20%20%22additionalProperties%22:%20false,%0A%20%20%20%20%20%20%22properties%22:%20%7B%0A%20%20%20%20%20%20%20%20%22name%22:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%22type%22:%20%22string%22%0A%20%20%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%20%20%22speed%22:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%22type%22:%20%22number%22%0A%20%20%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%20%20%22gun%22:%20%7B%0A%20%20%20%20%20%20%20%20%20%20%22$ref%22:%20%22#/$defs/Gun%22%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D,%0A%20%20%20%20%20%20%22required%22:%20%5B%0A%20%20%20%20%20%20%20%20%22name%22,%0A%20%20%20%20%20%20%20%20%22speed%22,%0A%20%20%20%20%20%20%20%20%22gun%22%0A%20%20%20%20%20%20%5D,%0A%20%20%20%20%20%20%22title%22:%20%22Ship%22,%0A%20%20%20%20%20%20%22type%22:%20%22object%22%0A%20%20%20%20%7D%0A%20%20%7D,%0A%20%20%22properties%22:%20%7B%0A%20%20%20%20%22Game%22:%20%7B%0A%20%20%20%20%20%20%22$ref%22:%20%22#/$defs/Game%22%0A%20%20%20%20%7D,%0A%20%20%20%20%22Ship%22:%20%7B%0A%20%20%20%20%20%20%22$ref%22:%20%22#/$defs/Ship%22%0A%20%20%20%20%7D%0A%20%20%7D,%0A%20%20%22required%22:%20%5B%0A%20%20%20%20%22Game%22,%0A%20%20%20%20%22Ship%22%0A%20%20%5D,%0A%20%20%22title%22:%20%22_Master_%22,%0A%20%20%22type%22:%20%22object%22%0A%7D