7

假设接口具有一些已知属性及其类型,并且可以具有其他具有未知键和其他类型的属性,例如:

interface Foo {
  length: number;
  [key: string]: string;
}

const foo : Foo = {
  length: 1,
  txt: "TXT",
};

TS错误:

“数字”类型的属性“长度”不能分配给字符串索引类型“字符串”。

这样的界面应该怎么打?

4

2 回答 2

7

[key: string]: string;这可以防止Foo接口没有字符串属性(在您的示例中,number)。

您可以做的是将两个接口中的已知和未知属性分开,并将您的目标类型定义为联合类型,如下所示:

interface Foo {      
  length: number;
}

interface Bar {
    [key: string]: string ;
}

type FooBar = Foo | Bar;

const foo : FooBar = {
  length: 1, // its ok defined in foo
  txt: "TXT", // string is ok
  baz : 3 // error because its not string
};

游乐场链接

于 2020-08-15T20:03:56.790 回答
3

看看这个片段它很好地解释了这一点

interface ArrStr {
  [key: string]: string | number; // Must accommodate all members

  [index: number]: string; // Can be a subset of string indexer

  // Just an example member
  length: number;
}

您可以查看这篇文章以获取更多详细信息(我从那里挑选了片段)

https://basarat.gitbook.io/typescript/type-system/index-signatures

对于这个元素

同时拥有字符串和数字索引器
这不是一个常见的用例,但 TypeScript 编译器仍然支持它。但是,它具有字符串索引器比数字索引器更严格的限制。这是故意的,例如允许输入以下内容:

于 2020-10-18T17:16:50.930 回答