建议生成的 fetch 对象中, 使用泛型来约束类型, 而不是属性
acrazing opened this issue · comments
目前生成的代码大概是这样:
export interface IModels {
'GET/welcome': {
Req: {},
Res: {},
}
}
export const createFetch() {
return {
'GET/welcome': (input) => doFetch('GET', '/welcome', input),
// ...
}
}
export const fetch = createFetch()
这样会生成大量的没有意义的 api 实例函数(createFetch
函数内返回的对象在编译成 js 后依旧存在), 建议改成这样:
export interface IModels {
'GET/welcome': {
Req: {},
Res: {},
}
}
export function fetch<K extends keyof IModels>(key: K, input: IModels[K]['Req']): Promise<IModels[K]['Res']> {
const pos = key.indexOf('/')
const method = key.substr(0, pos)
const url = key.substr(pos)
return doFetch(method, url, input)
}
这样生成的 js 代码就只有一个 fetch
实例了, 会简单很多, 并且 IDE 在提示的时候, 对函数参数的支持会比 ['GET/welcome']
这种形式更友好.
计划在 2.0 版本采用你的方案
但是我们要先评估下升级的风险,目前我们内部大量的项目都在使用这个方案,毕竟这个改动属于比较大的 breaking change,使用方式都要发生大的变化