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)[]
我不确定这是出于设计还是仅仅是当前实现的限制。我认为它实际上是后者,因为任何期望aT[]
的函数都必须将[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];
}