当我有一个带有索引签名的接口时,我对keyof
的工作方式感到困惑。
例如,如果我具有如下界面:
interface InterfaceOne {
[id: string]: InterfaceOne[keyof InterfaceOne];
a: SomeTypeOne;
b: SomeTypeTwo;
}
我想要一个函数,其参数只能是InterfaceOne
的有效属性,例如:
function test = (param: keyof InterfaceOne) => any
在上面的函数中,我应该能够调用test('a')
或test('b')
,但是test('c')
会导致编译错误,因为c
不是{ {1}}。
当我在InterfaceOne
中具有索引签名时,这似乎不起作用。
InterfaceOne
返回type myType = keyof InterfaceOne
。如果删除索引签名,它将按预期返回string | number
。
有人可以解释为什么添加索引签名会更改"a" | "b"
返回的类型吗?另外,我可以强制参数为keyof
属性名称的正确方法是什么?