Массив <Type> VS Type [] в Typescript


162

Насколько я знаю, тип свойства может быть определен двумя способами, когда это массив.

property_name: type

где тип может быть либо

Array<string>, Array<MyType>, etc. (e.g. let prop1: Array<string>)

и

string[], MyType[], etc. (e.g. let prop1: string[])

В чем разница между этими двумя случаями? Или я что-то недопонимаю (возможно, что-то о <> используемом в кастинге?)

РЕДАКТИРОВАТЬ, так как вопрос помечен как дубликат, я знаю, что есть другой вопрос о любом [], но все же я посмотрел на него перед публикацией, и для меня это было больше о типе 'any', чем различные [] VS < > Я спросил



1
Они являются практически одинаковыми конструкциями и фактически являются одними и теми же объектами во время выполнения. Reflect-metadata также будет обрабатывать их обоих как имеющих Arrayобъект в качестве конструктора. Смотрите выше связанный ответ.
— Джон Вайс

3
@ NitzanTomer этот вопрос устарел - тогда Array<T>еще не существовало.
— Натан Шивели-Сандерс

@ NathanShively-Сандерс ответ то же самое с или без дженериков , потому что этот вопрос может быть сведена к «какая различались let x: Array;в let x: any[];»
— Nitzan Томер

Ответы:


168

Нет никакой семантической разницы

Там нет никакой разницы вообще. Type[]это сокращенный синтаксис для массива Type. Array<Type>это общий синтаксис . Они полностью эквивалентны.

Руководство дает пример здесь . Это эквивалентно написать:

function loggingIdentity<T>(arg: T[]): T[] {
    console.log(arg.length);
    return arg;
}

Или:

function loggingIdentity<T>(arg: Array<T>): Array<T> {
    console.log(arg.length);
    return arg;
}

А вот цитата из некоторых заметок о выпуске :

В частности, number[]это сокращенная версия Array<number>, так же как Date[]сокращение для Array<Date>.

Тем не менее, есть случай, когда требуется сокращенный синтаксис

Начиная с TypeScript 3.4, есть разница для readonlyмодификатора нового типа. На самом деле:

readonlyмодификатор типа может быть использован только для синтаксиса на индексируемых типов и типов кортежей

let err2: readonly Array<boolean>; // error!    
let okay: readonly boolean[]; // works fine

Однако следующая декларация эквивалентна readonly boolean[]:

let okay2: ReadonlyArray<boolean>;

1
@dragonmnl, это универсальный тип. Просто прочитайте раздел «Привет, мир дженериков» в Руководстве .
— Палео

4
Официальной рекомендации нет. Я лично использую сокращение и только сокращение ( type[]), потому что это легче читать.
— Палео

2
Они больше не полностью идентичны: typescriptlang.org/docs/handbook/release-notes/…
— DShook

1
Если я правильно понял, readonlyесли это на самом деле не требуется. Если вы предпочитаете длинную запись, вы можете написать это так:let err2: ReadonlyArray<boolean>;
— n4nn31355

1
@ n4nn31355 Я так думаю. Я отредактировал, чтобы добавить это уведомление.
— Палео

-10
foo: Array

означает, что это простой массив с неявным anyтипом для его членов

foo: string[]

означает, что это массив строк, т. е. TypeScript сойдет с ума, если вы попытаетесь вставить в этот массив что-либо, кроме строк.


10
Вопрос был Array <string> vs string [], а не Array vs string [];
— Хуанги Джордан

Странно, но TypeScript не возражает, когда я foo: string[]
— передаю

3
Если вы передадите массив чисел, fn ([1,2,3]), то это не имеет значения. Если вы передаете переменную, а тип не является явным, пусть a = []; а = [1,2,3]; fn (a), тогда это не возражает, потому что тип a any []
— Квентин 2
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.