When designing API functions with multiple parameters, consolidate optional or related parameters into a single options object to improve extensibility and maintainability. This pattern prevents function signatures from becoming unwieldy and allows for easier future parameter additions without breaking changes.
When designing API functions with multiple parameters, consolidate optional or related parameters into a single options object to improve extensibility and maintainability. This pattern prevents function signatures from becoming unwieldy and allows for easier future parameter additions without breaking changes.
Key principles:
Example of good parameter consolidation:
// Before: Multiple separate parameters
export const QwenAIStream = (
stream: Stream<OpenAI.ChatCompletionChunk>,
callbacks?: ChatStreamCallbacks,
inputStartAt?: number,
)
// After: Consolidated into options object
export const QwenAIStream = (
stream: Stream<OpenAI.ChatCompletionChunk>,
options?: {
callbacks?: ChatStreamCallbacks;
inputStartAt?: number;
}
)
Example of using utility functions:
// Before: Manual URL construction
const avatarUrl = fileEnv.S3_PUBLIC_DOMAIN + '/' + filePath;
// After: Using utility function
const avatarUrl = await ctx.fileService.getFullFileUrl(filePath);
// Before: Manual URL joining
endpointUrl: instance.baseURL + '/' + payload.model
// After: Using urlJoin utility
endpointUrl: urlJoin(instance.baseURL, payload.model)
This approach makes APIs more maintainable, reduces the likelihood of bugs from manual implementations, and provides a clear upgrade path for future enhancements.
Enter the URL of a public GitHub repository