Как деструктурирующие массивы «типы кортежей» работают с массивами? - PullRequest
0 голосов
/ 25 апреля 2018

В приведенном ниже коде,

function f([first, second]: [number, number]){
    console.log(first);
    console.log(second);
}

var input:number[] = [1,2];
f(input);

number[] переменная типа (input) передается в f.

почему компилятор считает литерал [1,2] типом кортежа , а не типом массива в f([1,2])?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Речь идет не о массивах, а о простой проверке типов. Это выдает ошибку, потому что тип number[] отличается от [number, number].

Вы можете изменить тип input на [number, number] следующим образом

var input: [number, number] = [1, 2]

или оставьте ввод как есть и выполните следующее

f(input as [number, number])

Редактировать

f([1,2]) работает просто отлично, потому что вы явно передаете два числа.

0 голосов
/ 25 апреля 2018

TypeScript может быть очень конкретным в том, что он ожидает передать в метод.

Для вашего примера:

function f([first, second]: [number, number]){
    console.log(first);
    console.log(second);
}

Это будет работать:

var x: [number, number] = [1,2];

f([1,2]); // Type is implied:  [number, number]
f(x);     // Type is explicit: [number, number]

Это не будет:

var x = [1,2,3];
var y = [1,2];
var z: number[] = [1,2];

f(x); // Type is implied:  number[]
f(y); // Type is implied:  number[]
f(z); // Type is explicit: number[]

Вы сказали машинописи ожидайте массив, содержащий 2 числа.Вот почему он не будет принимать что-либо , кроме массива, содержащего 2 числа.

Вы можете изменить принятый тип следующим образом:

function f([first, second]: number[]){
// Keep destructuring ^,      ^ but change the accepted type.
    console.log(first);  
    console.log(second);
}

Затем любой изпредыдущие 6 примеров будут работать, так как [number, <number...>] также являются number[] массивами.

...