假设接口具有一些已知属性及其类型,并且可以具有其他具有未知键和其他类型的属性,例如:
interface Foo {
length: number;
[key: string]: string;
}
const foo : Foo = {
length: 1,
txt: "TXT",
};
TS错误:
“数字”类型的属性“长度”不能分配给字符串索引类型“字符串”。
这样的界面应该怎么打?
假设接口具有一些已知属性及其类型,并且可以具有其他具有未知键和其他类型的属性,例如:
interface Foo {
length: number;
[key: string]: string;
}
const foo : Foo = {
length: 1,
txt: "TXT",
};
TS错误:
“数字”类型的属性“长度”不能分配给字符串索引类型“字符串”。
这样的界面应该怎么打?
[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 编译器仍然支持它。但是,它具有字符串索引器比数字索引器更严格的限制。这是故意的,例如允许输入以下内容: