根据api文件夹自动生成api的ts类型
在使用vue/react+ts开发时,我们把api挂载到全局后,例如封装好axios后需要按模块划分请求,此时会创建一个modules文件夹,里面存放各个模块的请求,当把module所有的文件都动态挂载到proxy实例上时,我们可以通过proxy.$api.文件名.请求名去发起请求
例如:proxy.$api.test_api.test()
// src/api/index.ts
// 动态加载module下所有的文件
const files = import.meta.globEager('./module/*.ts')
const models= {}
for (const key in files) {
const keys = {}
for (const v in files[key]) {
Object.assign(keys, { [v]: files[key][v] })
}
models[key.replace(/(\.\/module\/|\.ts)/g, '')] = keys
}
export default models
// src/main.ts
import { createApp } from 'vue'
import api from '@/api'
const app = createApp(App)
app.config.globalProperties.$api = api
//src/xxx.vue
import { getCurrentInstance } from 'vue'
const { proxy } = getCurrentInstance()!
async function foo(){
const res = await proxy.$api.xxx()
}
第一点我们已经完成把所有的请求挂载proxy上并且可以通过proxy.$api.xxx.xxx去发起请求,为proxy添加拥有$api的类型很简单,只需要在xxx.d.ts文件声明@vue/runtime-core添加类型即可
//src/xx.d.ts
declare module '@vue/runtime-core' {
interface ComponentCustomProperties {
$api: GlobalApi.Api
}
}
declare namespace GlobalApi {
interface Api {
test_api: typeof import('@/api/module/test_api')
}
}
以上我们在使用时,Api.d.ts文件内容需要我们手动填写,假如后续modules文件夹文件越来越多,我们希望在改动modules文件夹下的内容时可以自动生成Api.d.ts文件内容
// vite.config.ts
import { defineConfig } from 'vite';
import { resolve } from 'path'
import viteGenerateApiPlugin from 'vite-plugin-generate-api'
const pathResolve = (dir:string) => resolve(__dirname, '.', dir)
export default defineConfig({
plugins:[
viteGenerateApiPlugin({
fileName: pathResolve('src/api/Api.d.ts'),
folderName: pathResolve('src/api/module'),
}),
],
// .....
});
- nodejs
- vite
- typeScript
- coder-cc