TypeScript 可变参数函数参数没有正确推断

50pmv0ei  于 5个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(71)

Bug报告
我正在尝试创建一个函数类型,其中参数是一些可变数量的泛型参数T,最后一个参数是可选的覆盖变量overrides?: FetchQueryOptions<R>,但是可变参数T无法分配给任何类型。以下是代码示例。

🔎 搜索词

泛型函数可变元组类型推断展开

🕗 版本与回归信息

  • 这是我尝试的每个版本的行为,我也查阅了常见问题解答中的条目

⏯ Playground链接

带有相关代码的Playground链接

💻 代码

interface FetchQueryOptions<R> {
    fetchFunc?: () => R;
}

export interface IGetQueryFunc<R> {
  <T extends any[]>(
    ...args: [...rest: T, overrides?: FetchQueryOptions<R>]
  ): FetchQueryOptions<R>;
}

const getUserPostQuery: IGetQueryFunc<string> = (
  userId: string,
  postId: number,
  overrides?: FetchQueryOptions<string>
): FetchQueryOptions<string> => {
  return {
      fetchFunc: () => 'some data:' + `${userId}` + `${postId}`,
      ...overrides
  }
};

🙁 实际行为

我得到了以下错误:

Type '(userId: string, postId: string, overrides?: FetchQueryOptions<string> | undefined) => FetchQueryOptions<string>' is not assignable to type 'IGetQueryFunc<string>'.
  Types of parameters 'userId' and 'rest' are incompatible.
    Type '[...rest: T, overrides?: FetchQueryOptions<string> | undefined]' is not assignable to type '[userId: string, postId: string, overrides?: FetchQueryOptions<string> | undefined]'.
      Variadic element at position 0 in source does not match element at position 0 in target.(2322)

🙂 预期行为

我希望 ...rest: T 能够正确地推断为 [string, number] 。并且 ...args 能够推断为 [string, number, FetchQueryOptions<string> | undefined]

qyyhg6bp

qyyhg6bp1#

在第一个覆盖中,元组
[...rest: T, overrides?: FetchQueryOptions<R>]
包含一个可选参数,紧跟在一个可变参数之后,这是不允许的(据我所知!-如果我知道错了,请告诉我)。*(注意:如果要扩展的元组长度固定,或者是一个固定长度元组的联合体,那么可选参数可以跟随扩展参数。)*例如, [...x:([number,string]|[number]), x?:boolean] 是允许的。
也许问题最好归类为在参数声明时没有出错,从而导致后续出现问题。

相关问题