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