Как мне создать стрелочную функцию с остальными параметрами, которые имеют разные типы возвращаемых значений в зависимости от количества переданных аргументов?

Например. Мне нужен safeId() со следующими типами возврата:

safeId() // () => string
safeId('foo') // (obj: any) => string
safeId('foo', 4, {}, ['hi']) // (...obj: any[]) => string[]

// Currently my return type isn't specific:
const safeId = (...objects: any[]) => string | string[] => {
  // Simplified
  if (objects.length > 1) return sanitizedObjectIds(objects) // string[]
  return 'id'
}
0
Stephen Koo 3 Июн 2020 в 08:36

1 ответ

Лучший ответ

Просто объявите все формы вашей функции и будьте осторожны, чтобы реализация могла обрабатывать их все:

function safeId(id?: string): string
function safeId(id: string, num: number, ...rest: any[]): string[]
function safeId(...objects: any[]): string | string[] {
  // Simplified
  if (objects.length > 1) return sanitizedObjectIds(objects) // string[]
  return 'id'
}

Обратите внимание, что для предотвращения двусмысленности я добавил второй обязательный параметр во вторую форму функции. В противном случае эта форма также будет соответствовать одному параметру (остальные будут просто пустым массивом).

РЕДАКТИРОВАТЬ: если вы хотите использовать функцию стрелки, к сожалению, компилятор будет жаловаться на возвращаемый тип. ИМХО, это ошибка TypeScript . Итак, единственный способ сделать это - отключить проверку типа, вернув any:

type SafeId = {
  (id?: string): string
  (id: string, num: number, ...rest: any[]): string[]
}

const safeId: SafeId = (...objects: any[]): any => {
  // Simplified
  if (objects.length > 1) return sanitizedObjectIds(objects) // string[]
  return 'id'
}

Обратите внимание, что для этого есть открытая проблема в TypeScript . репозиторий.

1
Stéphane Veyret 3 Июн 2020 в 07:52