Como adicionar tipos TypeScript a parâmetros desestruturados usando a sintaxe de propagação?

Ignore o fato de que isso é ruimadd função. É uma pergunta sobre o uso da destruição de matriz com sintaxe de propagação no TypeScript.

É isso que estou tentando

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

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

Mas não tenho ideia de como adicionar tipos TypeScript a isso. Meu melhor palpite é fazer algo assim (tradução mais direta)

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 as funções funcionam, mas no TypeScript eu perco a capacidade de desestruturar o parâmetro da matriz e o corpo da função é acumulado com várias coisas feias comoxs[0] exs.slice(1) - mesmo que eu as abstraia em suas próprias funções, isso está além do ponto.

É possível adicionar tipos a parâmetros de propagação desestruturados no TypeScript?

O que eu tentei até agora

Algo assim funciona para matrizes fixas

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

Mas é claro que preciso de entrada de matriz de comprimento variável. Eu tentei isso, mas não compila

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

questionAnswers(1)

yourAnswerToTheQuestion