TS错误:类型'T []'不能分配给'[T]'类型。 'T []'类型中缺少属性'0'

时间:2018-06-11 06:43:50

标签: typescript

打字稿中的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 []'
  • 中缺少属性“0”

为什么?它特别令人困惑,因为它们都会编译成相同的js代码:

// Foo[] notation    
var fooArray1 = [foo];
fooArray1 = fooArray1.concat([anotherFoo]);

// [Foo] notation (throws ts error)
var fooArray2 = [foo];
fooArray2 = fooArray2.concat([anotherFoo]);

1 个答案:

答案 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