打字稿中的T []和[T]有什么区别?
考虑以下打字稿代码:
interface Foo {
bar: string;
}
const foo: Foo = { bar: 'bar' };
const anotherFoo: Foo = { ...foo };
let fooArray1: Foo[] = [foo];
fooArray1 = [...fooArray1, anotherFoo]; // works
let fooArray2: [Foo] = [foo];
fooArray2 = [...fooArray2, anotherFoo]; // error: Type 'Foo[]' is not assignable to type '[Foo]'. Property '0' is missing in type 'Foo[]'.
Foo[]
语法时,可以使用数组解构的扩展运算符替换相同类型的新数组。[Foo]
语法时,它会抛出错误:类型'Foo []'不能指定为'[Foo]'类型。类型'Foo []' 为什么?它特别令人困惑,因为它们都会编译成相同的js代码:
// Foo[] notation
var fooArray1 = [foo];
fooArray1 = fooArray1.concat([anotherFoo]);
// [Foo] notation (throws ts error)
var fooArray2 = [foo];
fooArray2 = fooArray2.concat([anotherFoo]);
答案 0 :(得分:2)
T[]
是一个数组,意味着它可以是任意长度的。 [T]
是一个元组类型,它类似于一个数组(在运行时它们是数组)但它只能有一个类型为T
的元素。元组具有固定数量的元素,并且位置很重要:
let t1: [number, string] = [1, 'a'] //ok
let t2: [number, string] = ['a', 1] // error invalid types
let t3: [number, string] = [1, 'a', 'b'] // error too big
有关详细信息,请参阅here