如何将索引签名与已知属性混合?

use*_*818 4 typescript index-signature

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

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

const foo : Foo = {
  length: 1,
  txt: "TXT",
};
Run Code Online (Sandbox Code Playgroud)

TS错误:

'number' 类型的属性 'length' 不能分配给字符串索引类型 'string'。

应该如何键入这样的接口?

Eld*_*dar 5

[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
};
Run Code Online (Sandbox Code Playgroud)

游乐场链接