首页 > 解决方案 > 可变参数后元组中的可选函数参数

问题描述

我被这个简单的问题困住了:

declare function Foo<T extends string[]>(...s: [...T, number?]): void;

Foo("");
/* error: Argument of type '""' is not assignable to parameter of type 'number | undefined'.(2345) */

Foo(1); // ok

Foo("", 1); // ok

为什么第一个函数调用不起作用,而最后一个元组元素是可选的?我也尝试通过签名重载来解决这个问题,但也没有成功。

标签: typescripttypestuplesvariadic-functionsoptional-parameters

解决方案


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

Foo<[""]>("");

但这显然有点麻烦,所以我明白为什么它可能不受欢迎

游乐场链接

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

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

游乐场链接


推荐阅读