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



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

interface Foo {
length: number;
[key: string]: string;
}
const foo : Foo = {
length: 1,
txt: "TXT",
};

TS错误:

类型为"number"的属性"length"不可分配给字符串索引类型"string"。

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

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

游乐场链接

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

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编译器仍然支持它。然而,它有字符串索引器比数字更严格的限制索引器。这是有意的,例如允许键入以下内容:

最新更新