Let's look at the `createBody` method from the `HttpException` class:
class HttpException {
// ... other parts of the class ...
public static createBody(
nil: null | '',
message: HttpExceptionBodyMessage,
statusCode: number,
): HttpExceptionBody;
public static createBody(
message: HttpExceptionBodyMessage,
error: string,
statusCode: number,
): HttpExceptionBody;
public static createBody<Body extends Record<string, unknown>>(
custom: Body,
): Body;
public static createBody<Body extends Record<string, unknown>>(
arg0: null | HttpExceptionBodyMessage | Body,
arg1?: HttpExceptionBodyMessage | string,
statusCode?: number,
): HttpExceptionBody | Body {
if (!arg0) {
return {
message: arg1,
statusCode: statusCode,
};
}
if (isString(arg0) || Array.isArray(arg0)) {
return {
message: arg0,
error: arg1 as string,
statusCode: statusCode,
};
}
return arg0;
}
}
Breaking Down the Overloads
1. First Overload:
createBody(nil: null | '', message: HttpExceptionBodyMessage, statusCode: number): HttpExceptionBody;
This overload is used when you want to create a body with just a message and status code, without an error string.
2. Second Overload:
createBody(message: HttpExceptionBodyMessage, error: string, statusCode: number): HttpExceptionBody;
This overload allows creating a body with a message, an error string, and a status code.
3. Third Overload:
createBody<Body extends Record<string, unknown>>(custom: Body): Body;
This overload enables passing a custom body object, providing maximum flexibility.
4. Implementation:
createBody<Body extends Record<string, unknown>>(
arg0: null | HttpExceptionBodyMessage | Body,
arg1?: HttpExceptionBodyMessage | string,
statusCode?: number,
): HttpExceptionBody | Body
This is the actual implementation that handles all the above cases.