OpenAPI 本身并不直接支持将枚举键映射到对应的值。如果我们有如下所示的 C# 枚举:
枚举方向 {
上 = 0;
下 = 1;
左 = 2;
右 = 3;
}
对应的OpenAPI json文件会缺少枚举常量。为了提供这些枚举常量的名称,我们可以使用x-enum-varnames
扩展。这个扩展可以让我们为枚举提供额外的元数据,比如在代码中使用的变量名。
下面是我们在 OpenAPI JSON 文件中表示我们 C# 示例中的 Direction
枚举类型的方法:
{
"components": {
"模式": {
"方向": {
"type": "整数",
"enum": [0, 1, 2, 3],
"x-enum-varnames": ["上", "下", "左", "右"]
}
}
}
}
解释。
type
: 类型设为整型,因为在 C# 中枚举的值是整数。enum
: 此数组包含了枚举的所有可能整数值。x-enum-varnames
: 这是一个自定义扩展,列出了每个枚举值对应的变量名。此扩展不是官方 OpenAPI 规范的一部分,但通常用来提供额外的上下文或元数据。
结论
尽管 OpenAPI 本身不直接支持枚举的键值映射,但可以通过使用类似 x-enum-varnames
的扩展来灵活地包含额外的元数据。
客户端生成器工具如 openapi-generator-cli 可以利用此扩展为生成的枚举提供键值对映射。
即使这些工具不直接支持枚举类型,我们也可以通过后续处理来生成这些枚举类型。
const extractEnums = (openApiDoc: OpenAPIObject) => {
const schemas = openApiDoc.components?.schemas;
if (!schemas) return {};
const enumConstants = {} as Record<string, string>;
for (const [key, schema] of Object.entries(schemas)) {
if ("enum" in schema && "x-enum-varnames" in schema) {
const enumValues = schema.enum as number[];
const enumNames = schema["x-enum-varnames"] as string[];
const enumMap = enumNames.reduce((acc, name, index) => {
acc[name] = enumValues[index];
return acc;
}, {} as Record<string, number>);
const enumKey = key.replaceAll(".", "_");
enumConstants[key] = `
export const ${enumKey} = {
${enumNames.map((name) => `${name}: ${enumMap[name]}`).join(",\n")}
} as const;
`;
}
}
return `export namespace enums {
${Object.values(enumConstants).join("\n")}
}`;
}
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦