简单示例:
type Bar = { x: number; y: boolean }
type Foo = { [key: string]: Bar }
const foo: Foo = {
baz: { x: 3, y: true }
}
// This works fine
console.log(foo['baz'])
// Error: Property 'baz' does not exist on type '{ [key: string]: { x: number; y: boolean; }; }'.
console.log(foo.baz)
我希望最后一行输入check,foo.baz
的类型应为Bar
。如果索引签名不是制作这种类型的正确方法,那么它是什么?有可能吗?
答案 0 :(得分:2)
索引签名就像一本字典。对于访问,您需要使用索引。这是为了在使用时明确指出未找到的密钥是有效的可能性。
如果您知道会员总是会在那里注释,例如
type Foo = { [key: string]: Bar, baz:Bar }
答案 1 :(得分:0)
如果您想拥有已知属性,则可以执行以下操作:
interface Foo2 {
baz: Bar;
}
const foo2: Foo2 = {
baz: { x: 3, y: true }
}
console.log(foo2.baz); // fine
如果属性是任意的,您将不得不使用问题中的类型,并且您无法将这些值作为属性访问,因为正如您所说,键是任意的,编译器具有无法知道您指定的属性名称是否存在,例如您可能有拼写错误并使用bar
而不是baz
,编译器无法向您发出警告。< / p>