据我所知,当属性是数组时,它的类型可以用两种方式定义。

property_name: type

type可以是哪一种

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

and

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

这两种情况有什么不同?或者我误解了什么(也许是关于在类型转换中使用的<> ?)

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


当前回答

当定义固定长度的数组时,这是有区别的。你不能用array <>定义一个固定长度的数组,你必须使用速记语法:

const myFunc1 = (arg: [string, number, boolean]) => {
  console.log(arg);
};
myFunc1(["hello world", 123, true]);

// error: TS2314: Generic type 'Array ' requires 1 type argument(s).
const myFunc2 = (arg: Array<string, number, boolean>) => {
  console.log(arg);
};
myFunc2(["hello world", 123, true])

其他回答

没有任何语义上的差异

根本没有区别。Type[]是Type数组的简写语法。Array<Type>是泛型语法。它们完全相等。

手册中提供了一个例子。可以这样写:

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

Or:

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

以下是一些发行说明中的一段话:

具体来说,number[]是Array<number>的简写版本,就像Date[]是Array<Date>的简写版本一样。

关于只读类型修饰符

TypeScript 3.4引入了只读类型修饰符。准确地说:

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

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

下面的声明等价于readonly boolean[]:

let okay2: ReadonlyArray<boolean>;

当定义固定长度的数组时,这是有区别的。你不能用array <>定义一个固定长度的数组,你必须使用速记语法:

const myFunc1 = (arg: [string, number, boolean]) => {
  console.log(arg);
};
myFunc1(["hello world", 123, true]);

// error: TS2314: Generic type 'Array ' requires 1 type argument(s).
const myFunc2 = (arg: Array<string, number, boolean>) => {
  console.log(arg);
};
myFunc2(["hello world", 123, true])

也许有用!

interface IPrintArray<Type> {
   list: Type[]
}

function printArray<Type> (props: IPrintArray<Type>) {
  return <div>  </div>
}