Typescript 变量后元组中的可选函数参数

Typescript 变量后元组中的可选函数参数,typescript,types,tuples,variadic-functions,optional-parameters,Typescript,Types,Tuples,Variadic Functions,Optional Parameters,我遇到了一个简单的问题: 声明函数Foo(…s:[…T,number?]):void; Foo(“”); /*错误:类型为“”的参数不能分配给类型为“number | undefined”的参数。(2345)*/ Foo(1);//好啊 Foo(“,1);//好啊 为什么第一个函数调用不起作用,而最后一个元组元素是可选的? 我也尝试用签名重载来解决这个问题,但也没有成功。我不太清楚为什么当前版本不能正常工作。它实际上允许您传入一个空字符串,只要您不依赖推理: Foo<["&qu

我遇到了一个简单的问题:

声明函数Foo(…s:[…T,number?]):void;
Foo(“”);
/*错误:类型为“”的参数不能分配给类型为“number | undefined”的参数。(2345)*/
Foo(1);//好啊
Foo(“,1);//好啊
为什么第一个函数调用不起作用,而最后一个元组元素是可选的?
我也尝试用签名重载来解决这个问题,但也没有成功。

我不太清楚为什么当前版本不能正常工作。它实际上允许您传入一个空字符串,只要您不依赖推理:

Foo<[""]>("");
Foo(“”);
但这显然有点麻烦,所以我理解为什么它可能不可取

以下类型可能适合您;它适用于您提供的案例,但我没有发现任何不当行为:

declare function Foo<T extends string[]>(...s: [...T] | [...T, number]): void;
声明函数Foo(…s:[…T]|[…T,number]):void;

它解决了部分问题(我的错,我没有解释我的扩展需求)。对于“tail”参数,
T
不再是强类型:
typescript声明函数Foo(…s:[…T]|[…T,number]):[…T];Foo(“”;//返回类型:['']Foo(“,3);//返回类型:string[]
找到了!可以通过签名重载解决谢谢你的帮助@nicholas tower!