我有一个具有以下签名的函数:
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游乐场