2016-11-17 78 views
1

我正在学习TypeScript,所以请接受我的道歉问一个愚蠢的问题。数组解构不能与参数一起工作

下面的代码取自official docs,但它不起作用。它看起来像函数需要2个number s的Tuple代替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

看起来这个例子确实是错误或过时的,或者它可能是打字稿编译器中的一个错误。你是对的,[number, number]tuple type,并且input的类型被推断为number[],也就是说,数组的长度没有被保存在该类型中,并且你得到错误消息,因为f需要一个恰好2个元素的数组。

如果调用f与文字排列,将工作

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

您还可以,如果你声明参数作为数组它的工作:

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

f(input); 

,但它不会被检查数组长度这些调用也会编译:

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

@gamliela,要添加一个变量重刑@artem的回应,这是最好的排在首位正确定义的元组类型:

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

这样的TS2345预警:

f(input) 

就会消失。

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