如何从Swagger架构生成基本的TypeScript接口?

时间:2018-02-08 19:28:26

标签: typescript swagger code-generation

我正在寻找一种从Swagger架构生成简单TypeScript接口的方法。我发现的大多数解决方案都是不必要的复杂。

我想生成这样的接口:

export interface IBar {
    a?: string;
    b: number;
    c: Date;
    baz?: IBaz;
}

export interface IBaz {
    d: number;
    color: Color;
}

export enum Color {
    RED = 0,
    GREEN = 1,
    BLUE = 2,
}

来自这样的架构:

    {
  "x-generator": "NSwag v11.14.0.0 (NJsonSchema v9.10.24.0 (Newtonsoft.Json v9.0.0.0))",
  "swagger": "2.0",
  "info": {
    "title": "",
    "version": ""
  },
  "schemes": [],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "paths": {
    "/api/Foo/GetBarDescriptions": {
      "get": {
        "tags": [
          "Foo"
        ],
        "operationId": "Foo_GetBarDescriptions",
        "parameters": [],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "x-nullable": true
          }
        }
      }
    },
    "/api/Foo/GetBar": {
      "get": {
        "tags": [
          "Foo"
        ],
        "operationId": "Foo_GetBar",
        "parameters": [
          {
            "type": "integer",
            "name": "id",
            "in": "query",
            "required": true,
            "x-nullable": false,
            "format": "int32"
          }
        ],
        "responses": {
          "200": {
            "description": "",
            "schema": {
              "$ref": "#/definitions/Bar"
            },
            "x-nullable": true
          }
        }
      }
    },
    "/api/Foo/SetBar": {
      "post": {
        "tags": [
          "Foo"
        ],
        "operationId": "Foo_SetBar",
        "parameters": [
          {
            "name": "value",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Bar"
            },
            "x-nullable": true
          }
        ],
        "responses": {
          "204": {
            "description": ""
          }
        }
      }
    }
  },
  "definitions": {
    "Bar": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "B",
        "C"
      ],
      "properties": {
        "A": {
          "type": "string"
        },
        "B": {
          "type": "integer",
          "format": "int32"
        },
        "C": {
          "type": "string",
          "format": "date-time"
        },
        "Baz": {
          "$ref": "#/definitions/Baz"
        }
      }
    },
    "Baz": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "D",
        "Color"
      ],
      "properties": {
        "D": {
          "type": "number",
          "format": "decimal"
        },
        "Color": {
          "$ref": "#/definitions/Color"
        }
      }
    },
    "Color": {
      "type": "integer",
      "description": "",
      "x-enumNames": [
        "RED",
        "GREEN",
        "BLUE"
      ],
      "enum": [
        0,
        1,
        2
      ]
    }
  },
  "parameters": {},
  "responses": {},
  "securityDefinitions": {}
}

8 个答案:

答案 0 :(得分:6)

不确定这是否是一种理智的方式,这是我第一次玩Swagger。

我碰到了以下链接并粘贴了我整合的项目中的架构。从顶部的“生成客户端”菜单中,我选择了一个TypeScript预设,它生成了一个最小的项目,我可以在其中提取我需要的位,接口和类等。

http://editor.swagger.io/#/

我尝试运行您的架构。以下是生成代码的一小段摘录:

export interface Bar {
    "a"?: string;
    "b": number;
    "c": Date;
    "baz"?: Baz;
}

export interface Baz {
    "d": number;
    "color": Color;
}

/**
 * 
 */
export type Color = "0" | "1" | "2";

也许经过一些调整,它可以完全满足您的需求。

进一步阅读可能与https://github.com/swagger-api/swagger-codegen等工具有关,但在线网页编辑器是一种快速而肮脏的方法。

答案 1 :(得分:4)

您还可以查看autorest.typescript客户端代码生成器。它为所有模型定义提供了良好的接口,准确定义了只读属性和枚举。它支持一堆custom extensions,可用于改善生成的客户端的用户体验。您可以查看一些生成的sample clients

奖励:生成的typescript客户端在node.js中运行,也可以在webpack的帮助下在浏览器中运行。

答案 2 :(得分:2)

我一直在寻找一个仅生成类型而不生成任何可运行代码的软件包。我认为这与问题中的要求相同。我发现最能生成类型的是这个包:

https://www.npmjs.com/package/@manifoldco/swagger-to-ts

使用@ manifoldco / swagger-to-ts的2.0.0将为问题中的模式生成此代码:

/**
 * This file was auto-generated by swagger-to-ts.
 * Do not make direct changes to the file.
 */

export interface definitions {
  Bar: { A?: string; B: number; C: string; Baz?: definitions["Baz"] };
  Baz: { D: number; Color: definitions["Color"] };
  Color: "0" | "1" | "2";
}

注意:有一个像这样的软件包,没有任何组织前缀。确保尝试使用带@manifoldco前缀的那个。一开始我错过了这个细节,非常困惑:-)。

答案 3 :(得分:1)

您可以尝试使用此工具sw2dts,该工具生成的代码如下:

    window.addEventListener ("load", Start);

Color枚举似乎需要进行一些调整,其中应包含要迭代的属性名称,而不是实数。

答案 4 :(得分:0)

您还可以使用简单的json到打字稿转换器http://json2ts.com/从每个模式生成每个接口。 它不是全自动的,但总比没有好...而且简单。

答案 5 :(得分:0)

我使用dtsgen,在我的情况下效果很好。

yarn dtsgen --out ./path/to/generated-types.d.ts ./path/to/input/swagger.json.or.yml

答案 6 :(得分:0)

https://stackoverflow.com/a/43513850/4948492的启发:

Swagger Codegen为各种语言和框架(包括Node.js)生成服务器存根和客户端SDK。

要生成Node.js服务器存根,请使用-l nodejs-server参数运行codegen。

示例(Mac):

swagger-codegen generate -l typescript-angular -i swagger.yaml -o ~/Downloads/ts-test

答案 7 :(得分:0)

我正在使用swagger-typescript-api从摇摇欲坠的模式生成接口

npx swagger-typescript-api -p PATH_TO_YOUR_SCHEMA -o ./