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