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

Posted

技术标签:

【中文标题】可变参数后元组中的可选函数参数【英文标题】:Optional function parameter in tuple after variadic 【发布时间】:2021-01-12 05:54:13 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

Playground link

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

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

Playground link

【讨论】:

好吧,它解决了部分问题(我的错,我没有解释我的扩展需求)。在“tail”参数的情况下,T 不再是强类型:typescript declare function Foo&lt;T extends string[]&gt;(...s: [...T] | [...T, number]): [...T]; Foo(""); // return type: [""] Foo("", 3); // return type: string[] 找到了!可以通过签名重载来解决Playground link谢谢你的帮助@nicholas-tower!

以上是关于可变参数后元组中的可选函数参数的主要内容,如果未能解决你的问题,请参考以下文章

PHP函数中的可选参数不考虑顺序

Python中的类/函数中的可选参数[重复]

Javascript:函数中的可选参数[重复]

C++ 宏的可选参数

PL/pgSQL 函数中的可选参数

Java 构造函数 - 子类构造函数中的可选参数