据我所知,以下功能似乎在逻辑上是逻辑上的:
function testFunction<A,B,C,D> (a: A, more: [B, C, D]) : [A,B,C,D] {
return [a, ...more];
}
否则打字稿抱怨...more
,给出以下错误:
Type 'B | C | D' is not assignable to type 'B'.
Type 'C' is not assignable to type 'B'.
是我在这里错过了一些东西,还是这是一种疏忽,可以安全地使用return [a, ...more] as [A,B,C,D];
在应用传播运算符时,看起来类型的检查器确实确实将元组类型扩大到联合类型。观察:
const foo: [A, B] = ...
const bar = [...foo]; // inferred type (A | B)[]
我不确定这是通过设计还是仅仅是当前实现的限制。我希望这实际上是后者,因为任何期望T[]
的功能都必须 将 [A, B]
扩大到 (A | B)[]
以适合类型参数T
。
例子,没有办法使用Array.of
生成[A, B]
,因为它的签名为T[] Array.of<T>(...items: T[])
:
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];
}