Javascript 类型脚本错误:属性';0';类型中缺少

Javascript 类型脚本错误:属性';0';类型中缺少,javascript,typescript,knockout.js,observable,Javascript,Typescript,Knockout.js,Observable,我有这样的界面 导出接口详细信息{ 姓名:[{ 第一:字符串; 最后:字符串; }]; } 我有一个可观察的配置变量: Configuration:KnockoutObservable=ko.observable() 我想在构造函数中给它赋值,如下所示: config={ 姓名:[{ 第一条:“ABC”, 最后:“DEF” }, { 第一:“LMN”, 最后:“XYZ” }] }; 配置(config); 我得到一个错误: Types of property 'Name' is inc

我有这样的界面

导出接口详细信息{
姓名:[{
第一:字符串;
最后:字符串;
}];
}   
我有一个可观察的配置变量:

Configuration:KnockoutObservable=ko.observable()

我想在构造函数中给它赋值,如下所示:

config={
姓名:[{
第一条:“ABC”,
最后:“DEF”
},
{
第一:“LMN”,
最后:“XYZ”
}]
};
配置(config);
我得到一个错误:

Types of property 'Name' is incompatible and property '0' is missing in type.
Type '{ First:string; Last:string; }[]' is not assignable to 
type '[{ First: string; Last:string; }]'
我无法控制更改接口,因为它正在其他地方使用。
初始化此配置变量的正确方法是什么


提前感谢。

在此类型定义中:

interface Details {
  Name: [{
    First: string;
    Last: string;
  }];
}
Name
在编译时不是数组。它是一个只有一个元素的元组。Typescript中的元组可以有额外的元素,但不能有缺少的元素。作为一个1元组,
Name
本质上是一个必须至少有一个元素的数组

但是,在该值中:

const config = {
  Name: [{
    First: "ABC",
    Last: "DEF"
  },
  {
    First: "LMN",
    Last: "XYZ"
  }]
};
由于没有显式类型,此处的
Name
属性默认为数组类型。数组可以有任意数量的元素,包括零-这不适合1元组。这就是你的错误

可以通过向编译器提示文字实际上是元组来修复错误:

const config: Details = { Name: [{...}, {...}] };
如果您确实需要能够接收一系列名称,则必须进行一些铸造,可能类似于以下内容:

if (names.length > 0) {
  const config = {
    Name: names as Details['Name']
  };
  Configuration(config);
}
(如果可以确定元组仅仅是由编写打字的人造成的错误,则可以删除if检查。)

元组引用:

我遇到了同样的问题,并通过将界面更改为:

    interface Details {
        Name: {
            First: string;
            Last: string;
        }[];
    }

我知道您可能不希望更改界面,但希望这对处于这种情况的任何人都有帮助。

将界面更新为以下内容可以解决此问题:

 interface Details {
        Name: Array<{
            First: string;
            Last: string;
        }>;
    }
接口详细信息{
名称:数组;
}

此错误可能是由于错误地键入数组(就像我刚才所做的那样):

myArray:[]//不正确,导致类型中缺少“属性“0”的错误消息`
myArray:Array//对的
myArray:string[]//也正确
原因是括号表示Typescript中的元组,而不是数组


回答得很好!帮了我的忙,我想吻你!我为此奋斗了这么长时间,没有任何答案。非常感谢你!哈我很高兴这有帮助,因为不久前我确实发现自己也在同一条船上。以防万一,这里的解决方案是将
[]
移动到紧跟
{}
的位置,而不是
[{}]
。这是最新的typescript版本的语法更改。非常感谢:)没问题!很高兴看到这些年来仍然在帮助人们!你能解释一下为什么这会解决这个问题吗?我相信,[]在typescript中指的是元组类型,数组是javascript数组的更接近的表示形式。这是我的理解,括号?支撑?你对我说的是方括号[]大括号对我来说{}充其量术语是重载的。老实说,为什么TS会用[]来表示元组呢?我简直无法理解。
myArray:[]; //Incorrect, results in error message of `Property '0' is missing in type`

myArray: Array<string>; //Correct

myArray: string[]; //Also correct