我有这样的界面
export interface Details {
Name: [{
First: string;
Last: string;
}];
}
我有一个可观察的配置变量
Configuration: KnockoutObservable<Details> = ko.observable<Details>();
我想在构造函数中为它赋值如下 -
config = {
Name: [{
First: "ABC",
Last: "DEF"
},
{
First: "LMN",
Last: "XYZ"
}]
};
this.Configuration(config);
我收到了一个错误:
财产类型&#39;名称&#39;是不兼容的财产&#39; 0&#39;不见了 在类型。
键入&#39; {First:string;最后:字符串; } []&#39;不能分配给&#39; [{ 第一:字符串;最后:字符串; }]&#39;
我无法控制在其他地方使用界面时更改界面。初始化此配置变量的正确方法是什么?
提前致谢。
答案 0 :(得分:22)
我遇到了同样的问题,并通过将界面更改为:
来解决这个问题 interface Details {
Name: {
First: string;
Last: string;
}[];
}
我知道您可能不希望界面发生变化,但希望这对处于这种情况的任何人都有帮助。
答案 1 :(得分:9)
在此类型定义中:
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检查,如果你能确定那个元组只是一个错误,无论谁写了这些文字。)
元组参考: https://www.typescriptlang.org/docs/handbook/basic-types.html
答案 2 :(得分:6)
将界面更新为以下内容可以解决问题:
SELECT TRUNC("2018-04-04", "D") - INTERVAL 1 DAY ;
答案 3 :(得分:4)
此错误可能是由于错误地键入了一个数组(就像我刚才所做的那样):
myArray:[]; //Incorrect, results in error message of `Property '0' is missing in type`
myArray: Array<string>; //Correct
myArray: string[]; //Also correct
原因是大括号表示Typescript中的元组,而不是数组。