knockout.js 类型脚本错误:类型中缺少属性'0'

8ehkhllq  于 2022-11-10  发布在  其他
关注(0)|答案(4)|浏览(132)

我的界面是这样的

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);

我收到一个错误:

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; }]'

我无法控制接口的更改,因为它正在其他地方使用。
初始化此配置变量的正确方法是什么?
先谢谢你。

yrwegjxp

yrwegjxp1#

我遇到了同样的问题,并通过将界面更改为以下内容来解决:

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

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

50pmv0ei

50pmv0ei2#

这个错误可能是由于错误地输入了一个数组(就像我刚才所做的那样):

myArray:[]; //Incorrect, results in error message of `Property '0' is missing in type`

myArray: Array<string>; //Correct

myArray: string[]; //Also correct

原因是方括号表示Typescript中的元组,而不是数组。
The Docs

ztigrdn8

ztigrdn83#

在此类型定义中:

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);
}

(You如果你能确定这个元组仅仅是编写类型的人犯的一个错误,你就可以去掉if检查。)
元组引用:https://www.typescriptlang.org/docs/handbook/basic-types.html

a6b3iqyw

a6b3iqyw4#

将接口更新为以下版本应该可以解决此问题:

interface Details {
        Name: Array<{
            First: string;
            Last: string;
        }>;
    }

相关问题