导入 OpenAPI 规范生成的类型

如何解决导入 OpenAPI 规范生成的类型

我正在尝试将 openapi-client-axios 生成的类型导入到 Typescript 文件中。高级设置是我有一个后端 Web 服务,从中生成 api.json 文件,为提供的其余服务创建 OpenAPI 规范。然后,我尝试使用该文件创建一个客户端对象,我可以使用该对象在前端 Typescript 中调用该服务。第一部分(Web 服务 -> api.json 文件)可以正常工作。我也能够成功运行:

typegen api.json > proto.d.ts

这会生成一个包含客户端类型定义的文件 proto.d.ts。我将此文件放在我的项目中的 src/types/proto.d.ts 处,但在尝试将其导入到我实际需要的代码中时遇到了麻烦。该文件为 src/rigging/api.ts,如下所示:

import OpenAPIClientAxios from 'openapi-client-axios';
import { RestClient } from '@types';  // Error occurs here
// These also don't work
// import { RestClient } from './types/proto'
// import { RestClient } from 'proto'
// import { RestClient } from './types/proto.d.ts'
// import { RestClient } from 'proto.d.ts'
// import { RestClient } from '@types/proto'
// ... etc.

const api = new OpenAPIClientAxios({ definition: 'http://localhost:8000/openapi.json' });
const MyRestApi = api.getClient<RestClient>();

export default MyRestApi;

发生在 import { RestClient } ... 行上的错误似乎很明显:

TS2307:找不到模块“@types”或其相应的类型声明。

对我来说不明显的是如何解决这个问题。我已尝试将 proto.d.ts 文件重命名为 index.d.ts 并将其移动,但似乎无法正确加载它。我试图弄清楚 Typescript 如何加载定义文件,但找不到加载这种生成的类型定义文件的示例。

关于 Typescript、axios 和 Vue(我正在使用的框架),我还有很多不明白的地方,但在我看来,这种导入是我现在遇到的孤立问题。 @ 表示法似乎是在线文章所建议的,但它和点表示法(即 ./types/proto.d.ts)似乎都不起作用,导致少数其他错误之一(可以' t 查找或导入模块、错误的扩展名等)。我希望得到一个关于 Typescript 如何找到这个对象的简明解释,或者解释我在构造这个对象时出错的地方。目前,我的文件结构是:

src/
|- main.ts
|- App.vue
|- ...
|- rigging/
|  |- api.ts
|
|- types/
   |- proto.d.ts 

在根(src 上方)我也有 vue.config.jstsconfig.json,我知道这可能会影响这个(即,我的 typeRoots 可能是错的?目前是设置为 [ "./types" ]) 但我还没有弄清楚。

如果有用,这是生成的 proto.d.ts 文件:

import {
  OpenAPIClient,Parameters,// UnknownParamsObject,OperationResponse,AxiosRequestConfig,} from 'openapi-client-axios';

declare namespace Components {
  namespace Schemas {
    export interface Codex {
      id: number; // uint64
      name: string;
    }
  }
}
declare namespace Paths {
  namespace RestApiGetCodex {
    // eslint-disable-next-line no-shadow
    namespace Parameters {
      export type Id = number; // uint64
    }
    export interface PathParameters {
      id: Parameters.Id; // uint64
    }
    namespace Responses {
      export type $200 = Components.Schemas.Codex;
    }
  }
}

export interface OperationMethods {
  /**
   * rest_api_get_codex
   */
  'rest_api_get_codex'(
    parameters?: Parameters<Paths.RestApiGetCodex.PathParameters>,data?: any,config?: AxiosRequestConfig
  ): OperationResponse<Paths.RestApiGetCodex.Responses.$200>
}

export interface PathsDictionary {
  ['/codex/{id}']: {
    /**
     * rest_api_get_codex
     */
    'get'(
      parameters?: Parameters<Paths.RestApiGetCodex.PathParameters>,config?: AxiosRequestConfig
    ): OperationResponse<Paths.RestApiGetCodex.Responses.$200>
  }
}

export type RestClient = OpenAPIClient<OperationMethods,PathsDictionary>

解决方法

事实证明,解决方案相对简单:

import OpenAPIClientAxios from 'openapi-client-axios';
import { RestClient } from '@types/proto.d';  // Only drop the 'ts' part of the extension

typeRoots 中的 tsconfig.json 参数如下所示:

    "typeRoots": [
      "./src/types"
    ],

这使 @ 能够引用源目录的根。然而,它是非常字面的,因为导入只删除文件名的 .ts 部分,所以你必须导入它保留 .d 部分;因此from proto.d。另一种方法是从文件系统本身的名称中删除 .d,但这违反了定义文件约定。

,

我强烈建议使用 openapi-generator

有用的前端生成器:

  • typescript-axios
  • typescript-fetch

我在 2 个大型项目中将 typescript-fetchReact 结合使用,效果非常好。

生成示例:

// cli or package.json script

npx @openapitools/openapi-generator-cli generate -i ./api.json -g typescript-axios -o ./generated/api/ --additional-properties=typescriptThreePlus=true

CLI 最新版本的可执行版本

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res