Разница между определением типа массива и определением типа в массиве

#typescript

#typescript

Вопрос:

У меня есть два типа, определенные с использованием схожего синтаксиса, один как массив указанного типа, а другой как указанный тип в массиве (да, эти два звучат совершенно одинаково). Их определения являются:

 export type First = [{
            name: string,
            address: string
        }];

export type Second = {
    name: string,
    address: string
}[];
  

Я думал, что эти типы эквивалентны, поскольку я могу инициализировать их одними и теми же данными:

 let first : First = [{name:"First", address: "First Street"}];
let second: Second = [{name:"Second", address: "Second Street"}];
  

и я даже могу назначить first для second использования

 second = first
  

и это работает. Однако, когда я пытаюсь

 first = second
  

Я получаю сообщение об ошибке:

ошибка TS2322: тип ‘{ имя: строка; адрес: строка; }[]’ не может быть присвоен типу ‘[{ имя: строка; адрес: строка; }]’.
Свойство ‘0’ отсутствует в типе ‘{ name: строка; address: строка; }[]’.

На самом деле это уже некоторое время присутствует в моей кодовой базе, и я не обнаружил этого, поскольку все назначения выполнялись законным путем, и я только сейчас использовал это наоборот. Кто-нибудь может объяснить, в чем разница между двумя определениями типа?

Ответ №1:

Type [string] — это тип кортежа, который представляет массив с одним строковым элементом (с индексом 0). Type string[] — это тип массива, который представляет массив с любым количеством строк.

So [string] является подмножеством string[] , и именно поэтому вы можете присвоить значение с типом [string] переменной типа string[] , но не другим способом.

Однако вы должны быть в состоянии выполнить утверждение типа, используя <Type> или as Type для присваивания, если вы точно знаете, что это правильно.

 let singleStrArray: [string] = ['foo'];
let strArray: string[] = ['bar'];

singleStrArray = strArray as [string];
  

Комментарии:

1. Хорошо, это был мозговой пердеж (на самом деле первое определение используется, когда подразумевается второе). Спасибо за ответ