打字稿中的Array <Type> VS Type []


162

据我所知,当属性为数组时,可以通过两种方式定义属性的类型。

property_name: type

类型可以是

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

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

有什么区别两种情况之间?还是我误会了某些东西(例如有关<>的某些信息?)

编辑,因为该问题被标记为重复,我知道还有另一个关于any []的问题,但是我仍然在发布之前先看了一下,对我来说,它更多地是关于'any'类型而不是不同的[] VS < >我问



1
它们实际上是相同的构造,并且在运行时实际上是相同的对象。Reflect-metadata也将它们都视为具有Array对象作为其构造函数。请参阅以上链接的答案。
John Weisz

3
@NitzanTomer这个问题已经过时了- Array<T>当时不存在。
内森·希弗利·桑德斯

@ NathanShively·桑德斯的答案是相同的使用或不使用泛型,因为这个问题可以降低到“什么是之间的不同let x: Array;,以let x: any[];
Nitzan托默

Answers:


168

语义上没有任何区别

完全没有区别。Type[]是数组的简写语法TypeArray<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开始,新的type修饰符有所不同readonly。确实:

readonly类型修饰符只能用于语法上数组类型和的元组类型

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

但是,以下声明等效于readonly boolean[]

let okay2: ReadonlyArray<boolean>;

1
@dragonmnl,这是一个通用类型。只需阅读手册 “ Hello World ofgenerics”部分。
Paleo

4
没有官方建议。我个人使用速记,并且仅使用速记(type[]),因为它更易于阅读。
Paleo


1
如果我做对了,readonly以防万一它不是必需的。如果您喜欢长符号,可以这样写:let err2: ReadonlyArray<boolean>;
n4nn31355

1
@ n4nn31355我想是的。我进行了编辑以添加此通知。

-10
foo: Array

表示它是一个纯数组,any其成员具有隐式类型

foo: string[]

意味着它是一个字符串数组,即如果您尝试将字符串以外的任何内容推入该数组,TypeScript都会变得麻烦。


10
问题是Array <string> vs string [],而不是Array vs string [];
JuanguiJordán17年

奇怪的是,当我将数字数组传递给参数定义为foo: string[]
–jlewkovich

3
如果您传递数字数组fn([1,2,3]),那么它确实可以。如果您传递变量并且类型不是显式的,则让a = []; a = [1,2,3]; fn(a),则不介意,因为a是类型any []
Quentin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.