typescript来自排列运算符的并集类型



我有一个具有以下签名的函数:

test<T>(...args: T[]): T

如果我这样调用函数:

const a = test(1, 2, 3)

一切都按预期工作(a属于number类型(,但如果我这样称呼它:

const a = test(1, 2, "asd")

我得到任何错误:[EDIT]2带红色下划线:Argument of type '2' is not assignable to parameter of type '1'.,witch可能有点误导,因为参数是常量,但如果我这样称呼它:

let arg1 = 1;
let arg2 = "asd";
const a = test(arg1, arg2);

我得到错误:Argument of type 'string' is not assignable to parameter of type 'number'.

如何使函数(在第二种情况下(具有number | string的返回类型,而不在泛型参数中显式指定它

有意不将T推断为并集;请参阅Why is';t类型参数推断为并集类型?,以及microsoft/TypeScript#19596和microsoft/TypeScript#26746。

可能最简单的方法是允许args为任何数组类型T,然后通过使用键类型number:对其进行索引来获得其元素类型

declare function test<T extends any[]>(...args: T): T[number];
const a = test(1, 2, 3) // number
const b = test(1, 2, "asd") // number | string

游乐场链接到代码

我想这就是您正在寻找的呼叫签名:

<T extends Array<unknown>>(...args: T): T[number]

TypeScript游乐场

最新更新