typescript 中 t extends unknown[] 的谜团
在 TypeScript 中,“T extends unknown[]”表示类型 T 必须是未知长度的数组或元组。但是,为什么某些情况下应有三个参数呢?
让我们从一个示例函数 call 开始,它接受一个函数 f 和一组参数 args,并调用 f(args),其中 args 的类型由 T 决定。
function call( f: (...args: T) => R, ...args: T ): R { return f(...args); }
例如,考虑 fill 函数,它接受一个长度和一个值,并返回一个充满该值的数组:
function fill(length: number, value: string): string[] {
return Array.from({ length }, () => value);
}现在,我们可以使用 call 来调用 fill:
let aa = call(fill, 10, 'a'); // 返回 ["a", "a", ...] let bb = call(fill, 10); // 错误:需要 3 个参数 let cc = call(fill, 10, 'a', 'z'); // 错误:需要 3 个参数
为什么 bb 和 cc 会报错呢?因为 fill 函数需要三个参数,而 call 的签名要求 args 的数量与 T 的长度相匹配。这意味着,即使 bb 只传递了两个参数,它也必须是长度为 2 的数组或元组。类似地,cc 传递了四个参数,而它应该是一个长度为 3 的数组或元组。
因此,在使用 call 时,必须确保 args 的长度与 T 的长度相匹配。否则,TypeScript 编译器会发出参数数量不匹配的错误。










