destructuring - Hvordan tilføjer man TypeScript-typer til destrukturerede parametre ved hjælp af spread-syntaks?


Ignorer det faktum, at dette er en dårlig add-funktion. Det er et spørgsmål om at bruge array-destrukturering med spread-syntaks i TypeScript.

Dette er, hvad jeg prøver

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

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

Men jeg har ingen idé om, hvordan jeg tilføjer TypeScript-typer til dette. Mit bedste gæt er at gøre noget lignende (den mest direkte oversættelse)

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

Begge funktioner virker, men i TypeScript mister jeg muligheden for at destrukturere array-parameteren, og funktionens krop bliver fyldt med en masse grimt stuff som xs[0] og xs.slice(1) - selv hvis jeg abstraherer disse til deres egne funktioner, er det uden for pointen.

Er det muligt at tilføje typer til destrukturerede spredningsparametre i TypeScript?

Hvad jeg har prøvet indtil videre

Noget som dette virker for faste arrays

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

Men selvfølgelig har jeg brug for input med variable længder af arrays. Jeg prøvede dette, men det kompilerer ikke

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

Svar #1

Min fejl, svaret er lige så enkelt som:

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

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

(kode i legeplads)

Originalt svar:

Du kan gøre dette:

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

Du kan også bruge et typealias:

type AddFunction = (nums: number[]) => number;

const add: AddFunction = ([x, ...xs]) => {
    ...
}

Relaterede artikler