首页 > 解决方案 > 将“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总是导致字符串或数字?

制作包含传入的通用接口类型的所有属性的接口的正确方法是什么?

标签: typescript

解决方案


我想你正在寻找这个:

type IGFilter<T extends object> = {
  [K in keyof T]: GQuery | IGFilter<T>
} & {
  _NOT?: GQuery;
}

要点:

  • 通过做限制T为类型objectT extends object
  • 要遍历泛型类型的键,请使用映射类型:{ [K in keyof T]: ... }
  • 使用索引签名(如{ [key: string]: Foo })时,所有右侧属性必须符合 type Foo。如果您想混合不同类型的属性,请使用类型别名并将其与另一种类型相交(根据我的解决方案)。
  • keyof T可以是 3 种事物之一:string, number, 或symbol

推荐阅读