数组解构不使用函数的参数

时间:2016-11-17 07:50:42

标签: typescript typescript2.0

我正在学习TypeScript,所以请原谅我提出的问题。

以下代码取自official docs,但不起作用。看起来该函数期望Tuple两个number而不是Array,但另一方面它应该根据文档证明数组解构......

let input = [1, 2];
function f([first, second]: [number, number]) {
    console.log(first);
    console.log(second);
}
f(input);

错误:

src/main.ts(6,3): error TS2345: Argument of type 'number[]' is not assignable to parameter of type '[number, number]'.
  Property '0' is missing in type 'number[]'.

2 个答案:

答案 0 :(得分:3)

看起来这个例子确实是错误的或过时的,或者它可能是打字稿编译器中的一个错误。您是对的,[number, number]tuple typeinput的类型推断为number[],也就是说,数组的长度不会保留在类型中,并且您收到错误消息,因为f需要一个恰好包含2个元素的数组。

如果您使用文字数组调用f,则可以使用

f([1, 2]); // ok

如果将参数声明为array:

,也可以使其工作
let input: number[] = [1, 2];
function f([first, second]: number[]) {
    console.log(first);
    console.log(second);
}

f(input);

但它不会以这种方式检查数组长度,这些调用也会编译:

f([]);
f([1, 2, 3]);

答案 1 :(得分:0)

@gamliela,要为@artem的响应添加变体,最好在第一时间正确定义元组类型:

let input:[number,number] = [1, 2];
let [first, second] = input;

因此TS2345警告:

f(input)

将消失。

注意,如果您将doc示例原样复制到操场上,除非您在上面添加正确的元组类型定义,否则它会显示相同的TS2345警告。