¿Cómo agregar tipos TypeScript a parámetros desestructurados utilizando sintaxis de propagación?

Ignora el hecho de que esto es maloadd función. Se trata de utilizar la desestructuración de matrices con sintaxis extendida en TypeScript.

Esto es lo que intento

const add = ([x,...xs]) => {
  if (x === undefined)
    return 0
  else
    return x + add(xs)
}

console.log(add([1,2,3])) //=> 6

Pero no tengo idea de cómo agregar tipos TypeScript a esto. Mi mejor conjetura es hacer algo como esto (la traducción más directa)

const add = (xs: number[]): number => {
  if (xs[0] === undefined)
    return 0;
  else
    return xs[0] + add(xs.slice(1));
};

console.log(add([1,2,3])); // => 6

Ambas funciones funcionan, pero en TypeScript pierdo la capacidad de desestructurar el parámetro de matriz y el cuerpo de la función está lleno de un montón de cosas feas comoxs[0] yxs.slice(1) - incluso si abstraigo esto en sus propias funciones, eso está fuera del punto.

¿Es posible agregar tipos a parámetros de dispersión desestructurados en TypeScript?

Lo que he probado hasta ahora

Algo como esto funciona para arreglos fijos

// compiles
const add = ([x,y,z]: [number, number, number]): number => ...

Pero, por supuesto, necesito una entrada de matriz de longitud variable. Intenté esto, pero no se compila

// does not compile
const add = ([x, ...xs]: [number, number[]]): number => ...