假设接口的类型有一些已知的属性,并且可以有带有未知键的其他属性和一些其他类型,比如:
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编译器仍然支持它。然而,它有字符串索引器比数字更严格的限制索引器。这是有意的,例如允许键入以下内容: