【问题标题】:How to specify a different return type based on number of arguments passed to rest parameter function如何根据传递给剩余参数函数的参数数量指定不同的返回类型
【发布时间】:2020-06-03 15:52:58
【问题描述】:

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

例如我想要一个具有以下返回类型的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'
}

【问题讨论】:

  • 你的意思是像overloading?我没有仔细阅读它,但请检查this article是否可以帮助您。
  • 我尝试过重载,但遗憾的是你不能用不同数量的参数重载:tutorialsteacher.com/typescript/function-overloading“参数的数量应该相同”
  • 这不是真的,或者至少没有很好的解释。你可以在函数声明中使用不同数量的参数,你只需要关心函数实现中的所有情况。
  • 我尝试了以下变体:``` type SafeId = { (): string; (对象:任何):字符串; (...objects: any[]): string[]; } const safeId: SafeId = (...objects: any[]) => { } ``` 但是运气不好 - 你能告诉我你是怎么做的吗@StéphaneVeyret?
  • 我已经在下面的答案中做到了。我不知道它是否可以用箭头功能完成。给我几分钟,让我重新修改它……

标签: typescript typescript-generics


【解决方案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 存储库中有一个open issue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多