代码之家  ›  专栏  ›  技术社区  ›  defraggled

使用openapi typescript codegen,为什么这个Swagger模式生成Record<string,any>的模型?

  •  0
  • defraggled  · 技术社区  · 1 年前

    我的swagger.json包括以下模式:

    "schemas": {
                "BuildFruitBody": {
                    "properties": {
                        "id": {
                            "type": "number",
                            "format": "double"
                        },
                        "name": {
                            "type": "string"
                        }
                    },
                    "type": "object",
                    "additionalProperties": true
                }
            },
    

    然而,当我通过生成axios客户端时 npx openapi-typescript-codegen -i ./swagger.json -o src/services/api -c axios ,得到的模型如下:

    /* generated using openapi-typescript-codegen -- do no edit */
    /* istanbul ignore file */
    /* tslint:disable */
    /* eslint-disable */
    
    export type BuildFruitBody = Record<string, any>;
    
    

    我是不是做错了什么?为什么模型不能反映模式?

    下面是完整的swagger.json:

    {
        "components": {
            "examples": {},
            "headers": {},
            "parameters": {},
            "requestBodies": {},
            "responses": {},
            "schemas": {
                "BuildFruitBody": {
                    "properties": {
                        "id": {
                            "type": "number",
                            "format": "double"
                        },
                        "name": {
                            "type": "string"
                        }
                    },
                    "type": "object",
                    "additionalProperties": true
                }
            },
            "securitySchemes": {}
        },
        "info": {
            "title": "backend",
            "contact": {}
        },
        "openapi": "3.0.0",
        "paths": {
            "/swagger.json": {
                "get": {
                    "operationId": "Get",
                    "responses": {
                        "200": {
                            "description": "Ok",
                            "content": {
                                "application/json": {
                                    "schema": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    },
                    "tags": [
                        "swagger"
                    ],
                    "security": [],
                    "parameters": []
                }
            },
            "/fruit": {
                "post": {
                    "operationId": "Get",
                    "responses": {
                        "200": {
                            "description": "Ok",
                            "content": {
                                "application/json": {
                                    "schema": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    },
                    "tags": [
                        "fruit"
                    ],
                    "security": [],
                    "parameters": [],
                    "requestBody": {
                        "required": true,
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BuildFruitBody"
                                }
                            }
                        }
                    }
                }
            }
        },
        "servers": [
            {
                "url": "/"
            }
        ]
    }
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   CAAHS    1 年前

    我是不是做错了什么

    据我所见,不在代码范围内

    为什么模型不能反映模式

    实际上,它确实反映了模式。但也许是心理模型以不同的方式反映了模式模型,或者还没有被很好地理解

    <小时/>

    当在JSON架构中给定以下内容时(参见 additionalProperties json schema Core DRAFT-2020-12 )

    “类型”:“对象”,
    “additionalProperties”:true
    

    然后 记录<键,类型> 实用程序类型

    录制<字符串,任意>
    

    似乎是合法的,因为在JSON文本中,属性/属性名称是JSON字符串,并且可以是以下七种类型中的任意一种:JSON对象、JSON数组、JSON字符串、JSON编号、 “true” false和 null(参见JSON.org)

    这些属性/属性值可以表示为 TypeScript 中的任何

    <小时/>

    我能给出的最好的建议是将其进行自动测试,然后面对第一次测试意外失败(或没有因预期原因失败)的问题,然后解决它

    模式或期望取决于您的需求

    <小时/>

    作为 已解除碎片 根据以下评论进行确认:

    啊,是的,设置 additionalProperties:false 解决了这个问题。谢谢

    事实上,要求是没有额外的属性(这些属性本可以被排除在验证之外)

    这是一个强有力的迹象,表明它可能被排除在架构之外, additionalProperties 最近已从JSON架构验证移至JSON架构核心(DRAFT-2020-12)

    是否真正反映了模式模型?


    当在JSON模式中给定以下内容时(参见。 additionalProperties JSON Schema Core DRAFT-2020-12 )

                "type": "object",
                "additionalProperties": true
    

    那么 Record<Keys, Type> 公用事业类型

     Record<string, any>
    

    似乎合法,因为在JSON文本中,属性/属性名称是JSON字符串,并且可以 任何 其中七个:JSON对象、JSON数组、JSON字符串、JSON编号、, "true" , "false" "null" (参见json.org)。

    这些属性/特性值可以表示为 any in TypeScript


    我能给出的最好的建议是将其进行自动测试,然后面对第一次测试意外失败(或没有因预期原因失败)的问题,然后解决它。

    模式或期望取决于您的需求。


    作为 defraggled 根据以下评论进行确认:

    啊,是的,设置 additionalProperties: false 解决了。谢谢

    事实上,要求是没有额外的属性(这些属性本可以被排除在验证之外)。

    这是一个强有力的迹象,表明它可能被排除在模式之外, 附加属性 最近已从JSON模式验证转移到JSON模式核心(DRAFT-2020-12)。