typescript - 将“keyof GenericType”转换为字符串
问题描述
我正在尝试编写这样的界面:
interface IGFilter<T> {
[key: keyof T]: GQuery | IGFilter<T>,
_NOT?: GQuery
}
但是我不断收到错误:An index signature parameter type must be either 'string' or 'number'.
. 为什么是这样?如果键只能是字符串或数字,那为什么它认为keyof T
不是字符串或数字?不应该keyof Type
总是导致字符串或数字?
制作包含传入的通用接口类型的所有属性的接口的正确方法是什么?
解决方案
我想你正在寻找这个:
type IGFilter<T extends object> = {
[K in keyof T]: GQuery | IGFilter<T>
} & {
_NOT?: GQuery;
}
要点:
- 通过做限制
T
为类型object
T extends object
- 要遍历泛型类型的键,请使用映射类型:
{ [K in keyof T]: ... }
- 使用索引签名(如
{ [key: string]: Foo }
)时,所有右侧属性必须符合 typeFoo
。如果您想混合不同类型的属性,请使用类型别名并将其与另一种类型相交(根据我的解决方案)。 keyof T
可以是 3 种事物之一:string
,number
, 或symbol