我正在学习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[]'.
答案 0 :(得分:3)
看起来这个例子确实是错误的或过时的,或者它可能是打字稿编译器中的一个错误。您是对的,[number, number]
是tuple type,input
的类型推断为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警告。