Typescript 将元组分解为另一个元组类型不匹配

Typescript 将元组分解为另一个元组类型不匹配,typescript,Typescript,就我所知,以下函数在键入方面似乎在逻辑上是合理的: function testFunction<A,B,C,D> (a: A, more: [B, C, D]) : [A,B,C,D] { return [a, ...more]; } 我是否在这里遗漏了什么,或者这是类型检查器中的一个疏忽,可以安全地强制使用将[a,…more]返回为[a,B,C,D]在应用扩展运算符时,类型检查器似乎确实将元组类型扩展到联合类型。注意: const foo: [A, B] = ... co

就我所知,以下函数在键入方面似乎在逻辑上是合理的:

function testFunction<A,B,C,D> (a: A, more: [B, C, D]) : [A,B,C,D] {
    return [a, ...more];
}

我是否在这里遗漏了什么,或者这是类型检查器中的一个疏忽,可以安全地强制使用
将[a,…more]返回为[a,B,C,D]

在应用扩展运算符时,类型检查器似乎确实将元组类型扩展到联合类型。注意:

const foo: [A, B] = ...
const bar = [...foo];    // inferred type (A | B)[]
我不确定这是出于设计还是仅仅是当前实现的限制。我认为它实际上是后者,因为任何期望a
T[]
的函数都必须将
[a,B]
扩展到
(a | B)[/code>以适应类型参数
T

例如,无法使用
数组of
生成
[a,B]
,因为它的签名是
T[]数组of(…项:T[])

(a,b)的数组;//“B”类型的参数不能分配给“A”类型的参数。 (a,b);//很好,但推断类型(A | B)[] (…[a,b]);//很好,但推断类型(A | B)[]
解决此问题的一种方法是在不使用扩展运算符的情况下简单地构造结果数组:

function testFunction<A,B,C,D> (a: A, more: [B, C, D]) : [A,B,C,D] {
  return [a, more[0], more[1], more[2]];
}
函数测试函数(a:a,更多:[B,C,D]):[a,B,C,D]{ 返回[a,更多[0],更多[1],更多[2]]; }
或者稍微干净一点:

函数测试函数(a:a[b,c,d]:[b,c,d]):[a,b,c,d]{ 返回[a、b、c、d]; } 相关问题:
Array.of(a, b);        // Argument of type 'B' is not assignable to parameter of type 'A'.
Array.of<A | B>(a, b); // Fine, but inferred type (A | B)[]
Array.of(...[a, b]);   // Fine, but inferred type (A | B)[]
function testFunction<A,B,C,D> (a: A, more: [B, C, D]) : [A,B,C,D] {
  return [a, more[0], more[1], more[2]];
}
function testFunction<A,B,C,D> (a: A, [b, c, d]: [B, C, D]) : [A,B,C,D] {
  return [a, b, c, d];
}