Масив <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[])

Яка різниця між двома випадками? Або я щось не розумію (можливо, щось про <>, що використовується при кастингу?)

EDIT, оскільки запитання позначено як дублікат, я знаю, що є інше питання стосовно будь-якого [], але все ж я до цього переглянув його, і мені це стосувалося більше типу "будь-який", ніж іншого [] VS < > Я запитав



1
Вони практично однакові конструкції і фактично є одними і тими ж об’єктами під час виконання. Метадані Reflect також розглядають їх як 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[]
— jlewkovich

3
Якщо ви передасте масив чисел, fn ([1,2,3]), то це має значення. Якщо ви передаєте змінну і тип не є явним, дозвольте a = []; a = [1,2,3]; fn (a), то це не проти, тому що a - це тип []
— Квентін 2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.