我使用类似语法定义了两种类型,一种是指定类型的数组,另一种是数组中指定的类型(是的,这两种声音完全相同)。他们的定义是:
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';地址:字符串; } []”。
这实际上已经在我的代码库中存在了一段时间,而且我没有检测到它,因为所有的任务都是合法的,而我现在只是反过来使用它了。任何人都可以解释两种类型定义之间的区别吗?
答案 0 :(得分:2)
类型[string]
是元组类型,表示具有单个字符串元素的数组(在索引0处)。
类型string[]
是一种数组类型,表示具有任意数量字符串的数组。
因此[string]
是string[]
的子集,这就是为什么您可以将类型[string]
的值分配给string[]
类型的变量,而不是另一种方式。
但是,如果你确定它是正确的,你应该可以使用<Type>
或as Type
进行类型断言。
let singleStrArray: [string] = ['foo'];
let strArray: string[] = ['bar'];
singleStrArray = strArray as [string];