类型数组定义和类型数组定义之间的差异

时间:2016-10-21 13:02:43

标签: typescript

我使用类似语法定义了两种类型,一种是指定类型的数组,另一种是数组中指定的类型(是的,这两种声音完全相同)。他们的定义是:

export type First = [{
            name: string,
            address: string
        }];

export type Second = {
    name: string,
    address: string
}[];

我认为这些类型是等价的,因为我可以用相同的数据初始化它们:

let first : First = [{name:"First", address: "First Street"}];
let second: Second = [{name:"Second", address: "Second Street"}];

我甚至可以使用

first分配给second
second = first

它有效。但是当我尝试

first = second

我收到错误:

  

错误TS2322:输入'{name:string;地址:字符串; }[]' 不是   可分配给类型'[{name:string;地址:字符串; }]”。
  类型'{name:string;中缺少属性'0';地址:字符串; } []”。

这实际上已经在我的代码库中存在了一段时间,而且我没有检测到它,因为所有的任务都是合法的,而我现在只是反过来使用它了。任何人都可以解释两种类型定义之间的区别吗?

1 个答案:

答案 0 :(得分:2)

类型[string]是元组类型,表示具有单个字符串元素的数组(在索引0处)。 类型string[]是一种数组类型,表示具有任意数量字符串的数组。

因此[string]string[]的子集,这就是为什么您可以将类型[string]的值分配给string[]类型的变量,而不是另一种方式。

但是,如果你确定它是正确的,你应该可以使用<Type>as Type进行类型断言。

let singleStrArray: [string] = ['foo'];
let strArray: string[] = ['bar'];

singleStrArray = strArray as [string];