#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. Хорошо, это был мозговой пердеж (на самом деле первое определение используется, когда подразумевается второе). Спасибо за ответ