首页 > 解决方案 > 如何根据传递给剩余参数函数的参数数量指定不同的返回类型

问题描述

如何根据传递的参数数量创建具有不同返回类型的其余参数的箭头函数?

例如,我想要一个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'
}

标签: typescripttypescript-generics

解决方案


只需声明函数的所有形式,并注意实现可以处理所有形式:

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存储库中有一个未解决的问题。


推荐阅读