Разница между строками [] и [string]

Рассмотрим следующий пример Typescript. Первая строка приводит к ошибке 'type undefined [] не присваивается типу [string]'. Последние две строки компилируются.

let givesAnError: [string] = [];
let isOK: string[] = [];
let isAlsoOK: [string] = ["foo"];

Как вам нужно интерпретировать определение типа [string] в Typescript?

Ответ 1

Первый (givesAnError) и последний (isAlsoOK) являются кортежами, а второй (isOK) является массивом.

С массивами все ваши элементы одного типа:

let a: string[];
let b: boolean[];
let c: any[];

Но с кортежами вы можете иметь разные типы (и фиксированную длину):

let a: [string, boolean, number];
let b: [any, any, string];

Итак:

a = ["str1", true, 4]; // fine
b = [true, 3, "str"]; // fine

Но:

a = [4, true, 3]; // not fine as the first element is not a string
b = [true, 3]; // not fine because b has only two elements instead of 3

Важно понять, что вывод javascript всегда будет использовать массивы, так как в js нет такой вещи, как кортеж.
Но для времени компиляции это полезно.