如何使用扩展语法将TypeScript类型添加到析构参数?

时间:2017-02-18 23:43:19

标签: typescript destructuring spread-syntax

忽略这是错误add功能的事实。这是一个关于在TypeScript中使用数组解构和扩展语法的问题。

这就是我正在尝试的

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

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

但我不知道如何向此添加TypeScript类型。我最好的猜测是做这样的事情(最直接的翻译)

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

这两个函数都有效,但是在TypeScript中,我失去了对数组参数进行解构的能力,并且函数体被一堆丑陋的东西(如xs[0]xs.slice(1)所淹没 - 即使我抽象这些除了这一点之外,还有他们自己的功能。

是否可以在TypeScript中添加类型来解构扩展参数?

到目前为止我尝试了什么

这样的东西适用于固定数组

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

但当然我需要可变长度数组输入。我试过这个,但它没有编译

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

1 个答案:

答案 0 :(得分:3)

我的不好,答案很简单:

background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' height='10px' width='15px'%3E%3Ctext x='0' y='10' fill='gray'%3E%E2%96%BE%3C/text%3E%3C/svg%3E");

code in playground

原始答案:

你可以这样做:

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

您还可以使用类型别名:

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