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