财产' 0'在类型中缺失

时间:2017-06-09 01:00:41

标签: javascript typescript knockout.js observable

我有这样的界面

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;

我无法控制在其他地方使用界面时更改界面。初始化此配置变量的正确方法是什么?

提前致谢。

4 个答案:

答案 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中的元组,而不是数组。

The Docs