属性“长度”的类型不兼容。类型“4”不可分配给类型“1”

Posted

技术标签:

【中文标题】属性“长度”的类型不兼容。类型“4”不可分配给类型“1”【英文标题】:Types of property 'length' are incompatible. Type '4' is not assignable to type '1' 【发布时间】:2018-09-08 20:30:05 【问题描述】:

我目前正在学习 typescript / angular,无法弄清楚为什么 TSLint 将其作为错误抛出,但是代码本身可以工作并显示在浏览器中。

export class GreetingComponent implements OnInit 

  names: [ name: string ] = [ name: 'Tom' ,  name: 'Dave' ,  name: 'Katie' ,  name: 'John' ];
  constructor()  

  ngOnInit() 
  

具体是一行:

 names: [ name: string ] = [ name: 'Tom' ,  name: 'Dave' ,  name: 'Katie' ,  name: 'John' ];

完全错误:

[ts]
Type '[ name: string; ,  name: string; ,  name: string; ,  name: string; ]' is not assignable to type '[ name: string; ]'.
  Types of property 'length' are incompatible.
    Type '4' is not assignable to type '1'.
(property) GreetingComponent.names: [
        name: string;
    ]

【问题讨论】:

【参考方案1】:

类型:

[name: string]

是一个元素的tuple type。所以该类型只能是一个包含单个项目的数组。如果您希望类型是填充了这些对象的任意长度的数组,则可以写为

name: string[]

// Or if you prefer:

Array<name: string>

【讨论】:

啊完美。那改变了吗?它不在我的教程中,添加 const ''' export const PEOPLE [] = [ name: 'Tom' , name: 'Dave' , name: 'Katie' , 名称:'约翰'];''' 就我而言,在类似的问题中,只有第二个版本有效(Array)。在第一个版本(Object[])中,我的数组仍然被解释为一个元组。我不清楚为什么。 都是斯威夫特的错。【参考方案2】:

在这种情况下:

names: [ name: string ] = [ name: 'Tom' ,  name: 'Dave' ,  name: 'Katie' ,  name: 'John' ];

你应该这样写:

names:  name: string [] = [ name: 'Tom' ,  name: 'Dave' ,  name: 'Katie' ,  name: 'John' ];

对于第二个版本的代码,它会运行良好。

【讨论】:

以上是关于属性“长度”的类型不兼容。类型“4”不可分配给类型“1”的主要内容,如果未能解决你的问题,请参考以下文章

类型:类型变量与类型:字符串

与 Typescript 反应:“never[]”类型的参数不可分配给“StateProperties |”类型的参数(() => 状态属性)'

TS2416:“MyGuard”类型中的属性“canActivate”不可分配给基类型“CanActivate”中的相同属性

错误 TS2416:“ApolloError”类型中的属性“originalError”不可分配给基类型“GraphQLError”中的相同属性

类型 '' 不可分配给类型 '() =>

TypeScript 2.4.1 -> fontWeight -> 类型 'number' 不可分配给类型 '"inherit" | 400 |