破坏元组成另一个元组类型不匹配



据我所知,以下功能似乎在逻辑上是逻辑上的:

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];
}

最新更新