typescript 类型脚本重载:字符串或自定义对象作为函数参数和返回类型

fnatzsnv  于 2022-12-27  发布在  TypeScript
关注(0)|答案(1)|浏览(123)

我正在尝试重载TypeScript中的函数。
下面是我的代码:

/**
 * Returns a 400 Bad Request error.
 *
 * @returns A response with the 400 status code and a message.
 */
export function badRequest(): TypedResponse<{ message: string }>;
/**
 * Returns a 400 Bad Request error.
 *
 * @param errors - An object containing the errors from the Zod schema.
 * @returns A response with the 400 status code, a message and the errors.
 */
export function badRequest<T>(
  errors: ZodFormattedError<T>,
): TypedResponse<{ message: string; errors: ZodFormattedError<T> }>;
/**
 * Returns a 400 Bad Request error.
 *
 * @param errors - An error string.
 * @returns A response with the 400 status code, a message and the errors.
 */
export function badRequest(
  errors: string,
): TypedResponse<{ message: string; errors: string }>;
export function badRequest<T>(errors?: ZodFormattedError<T> | string) {
  return json(
    { message: 'Bad Request', ...(errors && { errors }) },
    { status: 400 },
  );
}

const myRequest = badRequest({
  _errors: [
    {
      code: 'invalid_type',
      expected: 'string',
      received: 'number',
      path: ['name'],
      message: 'Expected string, received number',
    },
  ],
});

我想让TypeScript知道,当badRequest在没有任何参数的情况下被调用时,返回类型只有一个消息,当它被用字符串调用时,它应该有一个包含字符串的属性errors,当它被用ZodFormattedError调用时,errors属性应该是那些错误。
我尝试了上面的代码,TypeScript命令:

No overload matches this call.
  Overload 1 of 3, '(errors: ZodFormattedError<{ _errors: unknown; }, string>): TypedResponse<{ message: string; errors: ZodFormattedError<{ _errors: unknown; }, string>; }>', gave the following error.
    Type '{ code: string; expected: string; received: string; path: string[]; message: string; }' is not assignable to type 'string'.
  Overload 2 of 3, '(errors: string): TypedResponse<{ message: string; errors: string; }>', gave the following error.
    Argument of type '{ _errors: { code: string; expected: string; received: string; path: string[]; message: string; }[]; }' is not assignable to parameter of type 'string'.

如何正确地重载这个函数?

ijxebb2r

ijxebb2r1#

    • 更新答复**

基于官方文档,typescript支持函数重载。谢谢Hesters的链接。
代码中的问题与已重载函数的参数类型以及尝试调用的参数类型有关。
根据实现,可以使用无参数字符串类型、ZodFormatter类型调用badRequest方法。但您尝试使用ZodFormatter类型列表调用该方法,这将导致问题。

在上面的代码片段中,方法被重载,没有参数,字符串类型,数字类型,当用数字类型的列表(未声明)调用时,它抛出一个错误。当用正确的参数调用时,它成功运行。

相关问题