【发布时间】:2022-01-10 09:06:44
【问题描述】:
variadic types 中的 partialCall 示例“使用”参数列表头部的参数。
我正在实现一个版本,其中参数从参数列表的尾部使用,但编译器在推断类型时遇到问题。
有没有办法改进这一点,使编译器可以正确推断类型?
type Arr = readonly unknown[];
function partialCallTail<T extends Arr, U extends Arr, R>(
f: (...args: [...T, ...U]) => R, ...tailArgs: U
) {
return (...headArgs: T) => f(...headArgs, ...tailArgs)
}
const foo = (x: string, y: number, z: boolean) => {}
// compiles, but verbose
const foo2: (x: string, y: number) => void = partialCallTail(foo, false)
foo2('a', 2)
const foo1: (x: string) => void = partialCallTail(foo, 2, false)
foo1('a')
// does not compile
partialCallTail(foo, false)('a', 2)
~~~
TS2345: Argument of type '(x: string, y: number, z: boolean) => void' is not assignable to parameter of type '(...args: [...unknown[], boolean]) => void'.
Types of parameters 'x' and 'args_0' are incompatible.
Type '[...unknown[], boolean]' is not assignable to type '[x: string, y: number, z: boolean]'.
Target requires 3 element(s) but source may have fewer.
Playground 在下方发表评论。
【问题讨论】:
标签: typescript generics