Typescript: sette sammen en union av rest-parametere?


Se koden:

type FN = <U>(...rest: U[]) => U

declare const fn: FN

let union = fn('bar', 123) // Argument of type '123' is not assignable to parameter of type 'string'

Jeg forventet at union skulle ha en unionstype string | number, men i stedet er U satt til typen til det første argumentet (string).

Er det mulig å sende typer på rest-argumenter til en union?

Lekeplass

Svar #1

Jeg er ikke sikker på designbeslutningene rundt dette, men hvis du har U[] vil ikke kompilatoren utlede en union for det, den vil heller gi en feil for primitive typer i det minste (dette resulterer for eksempel i en union let union=fn({ a: 'bar' }, { b: 123 })).

En enkel løsning er å bruke tupler i rest-parametere i stedet:

type FN = <U extends any[]>(...rest: U) => U[number]

declare const fn: FN

let union = fn('bar', 123) // string | number