Currently the generated API client consists of *Service classes which have a bunch of static methods to call the individual end points. This serves as a sort of name spacing, which is arguably already an anti pattern in JS/TS.
Instead it would be much preferable if the exports were plain functions. Instead of:
export class FooService {
public static getFoo(...args: Args) {
return __request(...args)
}
}
that would just be:
export const getFoo = (...args: Args) => __request(...args)
If you are worried about name duplication you can import from the relevant files directly, such as
import * as fooService from '.../apiclient/services/fooService'
That said, the operationId from openapi.json is already meant to be unique, so there really should never be a case where naming collisions are possible.
Advantages of this approach include:
- less code / more idiomatic (both in the generated code and the code that uses it)
- allows tree shaking of unused end points – This is a big one. Consider using only one or two end points from an API that has dozens or even hundreds of end points that all fall into the same service – you may argue about the design choices there but APIs are not always defined by those who use them.
- easy to mock individual imports in testing e.g. with jest
Currently the generated API client consists of *Service classes which have a bunch of static methods to call the individual end points. This serves as a sort of name spacing, which is arguably already an anti pattern in JS/TS.
Instead it would be much preferable if the exports were plain functions. Instead of:
that would just be:
If you are worried about name duplication you can import from the relevant files directly, such as
That said, the
operationIdfromopenapi.jsonis already meant to be unique, so there really should never be a case where naming collisions are possible.Advantages of this approach include: